[xml] 여러 개의 태그를 선택하는 XPath

이 단순화 된 데이터 형식이 주어지면 :

<a>
    <b>
        <c>C1</c>
        <d>D1</d>
        <e>E1</e>
        <f>don't select this one</f>
    </b>
    <b>
        <c>C2</c>
        <d>D2</d>
        <e>E1</e>
        <g>don't select me</g>
    </b>
    <c>not this one</c>
    <d>nor this one</d>
    <e>definitely not this one</e>
</a>

어떻게 모든 선택 것 CS, Ds와 E의 자녀의 B요소를?

기본적으로 다음과 같은 것이 있습니다.

a/b/(c|d|e)

대신 내 자신의 상황에서 a/b/, 사람들을 선택에 이르기까지의 쿼리 C, D, E노드가 실제로는 매우 복잡 나는이 일을하지 않도록하고 싶습니다 있도록 :

a/b/c|a/b/d|a/b/e

이게 가능해?



답변

정답은 다음과 같습니다.

/a/b/*[self::c or self::d or self::e]

이 점에 유의하십시오

a/b/*[local-name()='c' or local-name()='d' or local-name()='e']

너무 길고 잘못되었습니다 . 이 XPath 표현식은 다음과 같은 노드를 선택합니다.

OhMy:c

NotWanted:d

QuiteDifferent:e


답변

대신 속성 테스트를 사용하여 반복을 피할 수 있습니다.

a/b/*[local-name()='c' or local-name()='d' or local-name()='e']

Dimitre의 적대적 견해와는 달리 , OP가 네임 스페이스와의 상호 작용을 지정하지 않은 진공 상태에서는 위의 내용이 올바르지 않습니다 . self::축 공간 제한적인, local-name()아니다. OP의 의도가 c|d|e네임 스페이스에 관계없이 캡처하는 것이라면 (문제의 OR 특성을 감안할 때 시나리오라고 생각할 수도 있음) “정확한 투표가 여전히 남아있는 또 다른 대답”입니다.

OP가 자신의 질문에 명확하지 않은 답변을 명확하게 표시하면 답변을 진정으로 잘못된 것으로 삭제해도 무척 기쁘지만 정의없이 확정 할 수는 없습니다.


답변

왜 안돼 a/b/(c|d|e)? 방금 Saxon XML 라이브러리 (Clojure의 장점으로 멋지게 포장)를 사용해 보았지만 작동하는 것 같습니다.
abc.xmlOP에서 설명한 문서입니다.

(require '[saxon :as xml])
(def abc-doc (xml/compile-xml (slurp "abc.xml")))
(xml/query "a/b/(c|d|e)" abc-doc)
=> (#<XdmNode <c>C1</c>>
    #<XdmNode <d>D1</d>>
    #<XdmNode <e>E1</e>>
    #<XdmNode <c>C2</c>>
    #<XdmNode <d>D2</d>>
    #<XdmNode <e>E1</e>>)


답변

이것이 도움이되는지 확실하지 않지만 XSL을 사용하면 다음과 같은 작업을 수행합니다.

<xsl:for-each select="a/b">
    <xsl:value-of select="c"/>
    <xsl:value-of select="d"/>
    <xsl:value-of select="e"/>
</xsl:for-each>

이 XPath가 B 노드의 모든 하위를 선택하지는 않습니다.

a/b/*


답변