programing

여러 태그를 선택하는 XPath

bestprogram 2023. 10. 9. 23:28

여러 태그를 선택하는 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,D모래를Es의 자식인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']

Dimtre의 적대적인 의견과 달리, OP가 네임스페이스와의 상호작용을 명시하지 않은 진공상태에서 위 내용이 틀린 것은 아닙니다.self::axis는 네임스페이스 제한입니다.local-name()아닙니다.OP의 의도가 캡처하는 것이라면c|d|e네임스페이스에 관계없이(문제의 OR 특성을 고려할 때 심지어 가능성이 높은 시나리오라고 제안합니다), 이는 "아직도 긍정적인 표가 있는 또 다른 답변"이며, 이는 올바르지 않습니다.

당신은 정의 없이 확정적일 수 없지만, OP가 그의 질문을 제가 틀렸다는 것을 분명히 한다면 저는 정말로 제 대답이 틀렸다고 삭제할 수 있어서 매우 기쁩니다.

그거 좋지a/b/(c|d|e)? 방금 색슨 XML 라이브러리(Clojure goodness로 잘 마무리됨)로 시도했는데 작동하는 것 같습니다.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/*

언급URL : https://stackoverflow.com/questions/721928/xpath-to-select-multiple-tags