Nice programing

XPath-특정 유형의 자식이없는 노드 가져 오기

nicepro 2020. 11. 28. 12:24
반응형

XPath-특정 유형의 자식이없는 노드 가져 오기


XML : /A/B또는/A

자식 A이없는 모든 노드 를 얻고 싶습니다 B.

난 노력 했어

/A[not(B)]  
/A[not(exists(B))]

성공없이

/*[local-name()="A" and .... ]가능한 경우 구문을 사용하는 솔루션을 선호 합니다. 작동하는 아이디어가 있습니까?

설명. XML은 다음과 같습니다.

<WhatEver>
  <A>
    <B></B>
  </A>
</WhatEver> 

또는

<WhatEver>
  <A></A>
</WhatEver>

어쩌면 *[local-name() = 'A' and not(descendant::*[local-name() = 'B'])]?

또한 루트 요소가 하나만 있어야하므로 /A[...]모든 XML을 다시 가져 오거나 전혀 가져 오지 않습니다. 어쩌면 //A[not(B)]또는 /*/A[not(B)]?

나는 왜 /A[not(B)]당신을 위해 작동하지 않는지 이해 하지 못합니다.

~/xml% xmllint ab.xml
<?xml version="1.0"?>
<root>
    <A id="1">
            <B/>
    </A>
    <A id="2">
    </A>
    <A id="3">
            <B/>
            <B/>
    </A>
    <A id="4"/>
</root>
~/xml% xpath ab.xml '/root/A[not(B)]'
Found 2 nodes:
-- NODE --
<A id="2">
    </A>
-- NODE --
<A id="4" />

이것 "/A[not(.//B)]"또는 이것을 시도하십시오 "/A[not(./B)]".


첫 번째 /로 인해 XPath가 문서의 루트에서 시작됩니다. 의도 한 바가 아닐 수도 있습니다.

아마도 당신은 // A [not (B)]를 의미했을 것입니다. 이것은 직접 B 자식이없는 어떤 수준에서도 문서의 모든 A 노드를 찾을 것입니다.

또는 A 노드가 포함 된 노드에 이미있을 수 있습니다.이 경우 A [not (B)]를 XPath로 지정합니다.


루트에서 계층 구조의 어느 곳에서나 A를 얻으려는 경우 이것은 작동합니다 (xslt 1.0 및 xslt에서 사용되는 경우 2.0)

//descendant-or-self::node()[local-name(.) = 'a' and not(count(b))]

또는 할 수 있습니다

//descendant-or-self::node()[local-name(.) = 'a' and not(b)]

또는

//descendant-or-self::node()[local-name(.) = 'a' and not(child::b)]

xslt에서 동일한 것을 달성하는 방법은 없습니다.

참고 : XPath는 대소 문자를 구분하므로 노드 이름이 다른 경우 (아무도 A, B를 사용하지 않을 것임) 대소 문자가 일치하는지 확인하십시오.


이것을 사용하십시오 :

/*[local-name()='A' and not(descendant::*[local-name()='B'])]

참고 URL : https://stackoverflow.com/questions/862239/xpath-get-node-with-no-child-of-specific-type

반응형