2008-10-09 6 views
2

특정 네임 스페이스의 일부인 요소를 선택하는 데 문제가 있습니다. 의 Xalan 라이브러리를 사용하는 경우 내 XPath 식은 XMLSPY에서 작동하지만 실패 ..특정 네임 스페이스 내에서 요소를 선택하는 방법은 무엇입니까?

<item> 
    <media:content attrb="xyz"> 
    <dcterms:valid>VALUE</dcterms:valid> 
    </media:content> 
</item> 

내 표현이 ./item/media:content/dcterms:valid입니다. 이미 두 네임 스페이스 정의를 내 XSLT에 추가했습니다. 다시 말하지만 XMLSpy에서 올바른 값을 선택하지만 Xalan 라이브러리를 실행할 때 실패합니다.

아이디어가 있으십니까?

답변

0

XML blob의 네임 스페이스를 정의하려고 시도 했습니까?

  • <item xmlns:dcterms="http://dcterms.example" xmlns:media="http://media.example"> 
        <media:content attrb="xyz"> 
        <dcterms:valid>VALUE</dcterms:valid> 
        </media:content> 
    </item> 
    

    의 xmlns : DCTERMS = "HTTP : //dcterms.example"미디어 =
  • 의 xmlns : 아마도
+0

이미 소스 XML에 있습니다. – TChen

-1

"HTTP //media.example" XMLSpy는 XPath가 부분이라고 생각하는 2.x XSLT 스펙을 구현했습니다. 다른 한편 Xalan은 여전히 ​​1.x입니다.

+0

XSLT 1.0과 XSLT 2.0의 릴리스 (기본적으로)에 해당하는 XPath 1.0과 XPath 2.0 스펙이 있습니다. 그가 시도하는 XPath는 유효한 XPath 1.0입니다. –

0

XPath를 평가하려는 컨텍스트는 무엇입니까? (예 : XSLT?) 루트 요소 인 경우 ".": "/ item/media : content/dcterms : valid."를 제거해보십시오. 일련의 항목이있는 경우 시작 부분에 "/ item/media : content/dcterms : valid."라는 다른 슬래시를 추가해보십시오. 그러면 문서 구조가 어디에 있든 관계없이 해당 기준과 일치하는 문서의 모든 항목이 선택됩니다.

0

XML의 접두사는 특정 네임 스페이스에 바인딩 될 때까지 의미가 없으며 XPath 식에도 해당됩니다. 동일한 접두사를 사용했기 때문에 단순히 일치하지 않습니다.

XPath 표현식에있는 접두어에 대한 전체 네임 스페이스 URI를 제공하는 고유 한 PrefixResolver 클래스를 만들어야합니다.

1

org.apache.xml.utils.PrefixResolver을 구현하여 접두사를 네임 스페이스 URI에 매핑 한 다음 사용하는 XPath 인스턴스에 인스턴스를 전달해야합니다. 이렇게하면 XPath 표현식에서 다른 접두어를 사용할 수 있습니다 (제어 할 수없는 경우).

예를 들어지도 쌍 (접두사 -> 네임 스페이스 URI에서 매핑하고 URI에서 접두어로 매핑하는 매핑)을 사용하는 구현을 만들 수 있습니다.

JAXP에서 구현할 해당 인터페이스는 javax.xml.namespace.NamespaceContext입니다.

0

로컬 이름에 XPath 선택을 시도하고 (선택적으로) 네임 스페이스 URI를 제공 할 수 있습니다. 그리고 예 :

/*[local-name()='NewHireList' and namespace-uri()='http://BRE.NewHireList']/*[local-name()='Record' and namespace-uri()=''] 

은 이상 this page를 참조하거나 로컬 이름과 XPath에에 구글.