이 단순화 된 데이터 형식이 주어지면 :
<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>
어떻게 모든 선택 것 C
S, D
s와 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.xml
OP에서 설명한 문서입니다.
(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/*