2013-12-09 4 views
1

노드의 기본 네임 스페이스를 가져 오는 XPath 식을 찾고 있습니다.기본 네임 스페이스를 가져 오는 XPath 식

내 XML 문서는 다음과 같을 수 있습니다.

<aaa> 
    <bbb xmlns="ns1" xmlns:ggg="ns2" attribute="value" attribute2="value2"> 
     <ccc /> 
    </bbb> 
    <bbb xmlns="ns4" xmlns:ggg="ns5" attribute="value" attribute2="value2"> 
     <ddd /> 
    </bbb> 
</aaa> 

나는 ns1을 얻고 싶습니다. 다음 표현식으로 시도했지만 아무 것도 작동하지 않습니다. (Java 1.7에서 프로그래밍 중이므로 (XPath 1.0이므로) http://chris.photobooks.com/xml/default.htm에 온라인 XPath 비주얼 라이저로 테스트했습니다.) 상기 attribute2 -nodes -

/aaa/*[name()='bbb' and position()=1]/attribute::* 

이 식은 단지 attribute를 선택한다.

/aaa/*[name()='bbb' and position()=1]/namespace::* 

이 표현식은 아무 것도 선택하지 않습니다.

누군가 나에게 힌트를 주시면 감사하겠습니다.

답변

2

귀하의 표현

/aaa/*[name()='bbb' and position()=1]/namespace::* 

은 정확하고 세 개의 네임 스페이스 노드를 반환합니다. 이 노드가 리턴 된 후 노드를 처리하는 방식에 문제가있을 수 있습니다. 이 표현식은 XPath 1.0과 XPath 2.0 모두에서 작동해야하지만, JDK에 내장 된 XPath 엔진을 사용하여 확인하지는 않았습니다.

(덧붙여 말하자면, JDK 1.7을 사용하고 있기 때문에 XPath 1.0을 사용하는 것은 Java 사용자가 사용할 수있는 여러 XPath 2.0 엔진이 있기 때문에 완전히 비 연속입니다.)

이 쿼리가 이미 BBB 요소는 기본 네임 스페이스에 있다고 가정하기 때문에, 단지 기본 네임 스페이스에 해당하는 네임 스페이스 URI는, 참으로

/aaa/*[name()='bbb' and position()=1]/namespace::*[name()=''] 

를 사용하거나 반환 사용

namespace-uri(/aaa/*[name()='bbb' and position()=1]) 
+0

답변 해 주셔서 감사합니다. 나는 실수하지 않았기 때문에 기쁘다. XPath 엔진에서 실제로 빌드되었습니다. 이제 저는 saxon 라이브러리를 사용하고 있으며 모든 것이 잘 작동합니다. –

0

page은 xpath의 namespace-uri 기능을 설명합니다.

그것은 당신이 뭔가를하고자 다음과 같습니다

namespace-uri(/aaa/*[name()='bbb' and position()=1]) 

네임 스페이스를 지정하지 않으면, 당신은 결과로 빈 문자열을 얻을 것이다.

편집 : 귀하의 질문을 다시 읽고 내 대답이 당신이 찾고있는 것인지 확신이 서지 않습니다. namespace-uri 함수는 <ns1:bbb>과 같은 노드에 대한 URI를 찾는 데 사용됩니다. ns1에 대한 URI를 반환합니다. 나는 실제로 사용되었을 때와 다른 네임 스페이스 정의를보기 위해 x-path를 사용하는 방법이 있는지 확신하지 못한다.

+0

안녕 너는 나를 올바르게 이해했다. XPath 엔진에서 쿼리를 실행해도 unter 빌드는 작동하지 않지만 좋은 해결책입니다. saxon 라이브러리를 변경하면 문제가 없습니다. 감사! –

관련 문제