2009-07-09 5 views
4

특정 속성을 갖는 노드 하나 (실제로는 노드가 아닌 속성에 관심이있는)를 찾는 XPath는 무엇입니까? 예를 들어, 내 XML에서 lang 특성을 가진 여러 태그가 있습니다. 나는 그들 모두가 같은 가치를 가져야한다는 것을 압니다. 나는 그저 그들 중 하나를 갖고 싶다.XPath : 속성 노드 찾기 (단 하나만)

지금이 작업을 수행합니다 : //*[1][@lang]/@lang,하지만 알 수없는 이유로 제대로 작동하지 않는 것 같습니다.

내 시도는 모든 @lang 값 ('en en en ...')을 연결하지 않고, 때로는 inbetween를 사용하여 모든 XML에 적용하지 않는 것에 이르기까지 모든 것을 이끌어 냈습니다.


편집 : 함수 position()lang 속성의 존재에 대한 시험 전에 호출되기 때문에

는 사실 //@lang[1]이 작동하지 않을 수 있습니다. 따라서 항상 XML에서 발견되는 첫 번째 요소가 필요합니다. 많은 시간 동안 lang 속성이 루트 요소에 있었기 때문에 가장 효과적이었습니다.

답변

6

, 여기에 작동하는 솔루션입니다 :

(//@lang)[1] 

괄호는 속성 이름에서 [1]를 분리하는 데 필요한 그렇지 않으면 position() 함수가 속성의 부모 요소 내에 적용됩니다 (태그 내에 특정 이름의 속성이 하나만있을 수 있으므로 쓸모가 없습니다). 따라서 //@lang[2]은 항상 noth를 선택합니다 ing).

2

시도해 보셨습니까?

//@lang[1] 

here 예를 볼 수 있습니다.

+0

아니요. 첫눈에 그것은 훨씬 좋아 보인다, 나는 철저한 시험을 즉시 만들 것이다! 감사. – glmxndr

+0

실제로 제대로 작동하지 않으면 부모 요소에있는 첫 번째 lang 요소가 모두 선택됩니다. – glmxndr

1

다음 XPath를 당신이 원하는 것을 할 것 같다 : 좀 더 태클 후

//*[@lang][1]/attribute::lang 
+0

흠 ... 나는 똑같은 일을하는 것이 두려워 ... – glmxndr

+0

@subtenante : 당신의 의견에 대해 아무것도 알지 못한다면 나는 이것이 효과가 있다고 말할 것이다. @Artem Barger의 솔루션은 훨씬 더 우아합니다. – Tomalak

+0

@Tomalak : 불행히도 그것은하지 않으며 왜 설명 할 수 없습니다. – glmxndr