/ / XPath: एक अन्य भाई - xpath तक सभी भाई-बहनों का चयन करें

XPath: एक और भाई - xpath तक सभी भाई बहनों का चयन करें

यहाँ मेरे xml का एक अंश है:

<node/>
<node/>
<node id="1">content</node>
<node/>
<node/>
<node/>
<node id="2">content</node>
<node/>
<node/>

में तैनात हूँ node[@id="1"]। मुझे सभी का मिलान करने के लिए एक Xpath की आवश्यकता है <node/> अगले नोड खाली नहीं है जब तक तत्वों (यहाँ) node[@id="2"])।


संपादित करें: @id विशेषताएँ केवल मेरी समस्या को अधिक स्पष्ट रूप से समझाने के लिए हैं, लेकिन मेरे मूल XML में नहीं हैं। मुझे एक समाधान की आवश्यकता है जो @id विशेषताओं का उपयोग नहीं करता है।


मैं करता हूँ नहीं खाली भाई-बहनों का मिलान करना चाहते हैं node[@id="2"], तो मैं एक भोले का उपयोग नहीं कर सकता following-sibling::node[text()=""].

इसे कैसे प्राप्त किया जा सकता है ?

उत्तर:

उत्तर № 1 के लिए 21

आप सकता है इसे इस तरह से करें:

../ नोड [नहीं (पाठ) () और पूर्ववर्ती- भाई-बहन :: नोड [@id] [१] [@ आईडी = "१"]]

कहा पे "1" वर्तमान नोड की आईडी है (अभिव्यक्ति को गतिशील रूप से उत्पन्न करें)।

अभिव्यक्ति कहती है:

  • वर्तमान संदर्भ से जनक पर जाएँ
  • उन बच्चे नोड्स का चयन करें जो
  • कोई पाठ और नहीं है
  • सभी "पूर्ववर्ती सिबलिंग नोड्स जिसमें एक आईडी है" पहले वाले के पास 1 आईडी होना चाहिए

यदि आप XSLT में हैं, तो आप निम्न-सिबलिंग अक्ष से चुन सकते हैं क्योंकि आप उपयोग कर सकते हैं current() समारोह:

<!-- the for-each is merely to switch the current node -->
<xsl:for-each select="node[@id="1"]">
<xsl:copy-of select="
following-sibling::node[
not(text()) and
generate-id(preceding-sibling::node[@id][1])
=
generate-id(current())
]
" />
</xsl:for-each>

या सरल (और अधिक कुशल) एक कुंजी के साथ:

<xsl:key
name="kNode"
match="node[not(text())]"
use="generate-id(preceding-sibling::node[@id][1])"
/>

<xsl:copy-of select="key("kNode", generate-id(node[@id="1"]))" />

जवाब के लिए 9 № 2

स्वीकृत उत्तर की तुलना में सरल:

//node[@id="1"]/following-sibling::node[following::node[@id="2"]]
  • एक नोड कहीं भी खोजें जिसकी आईडी "1" है
  • अब निम्नलिखित सभी भाई-बहनों को खोजें node तत्वों
  • ... लेकिन केवल अगर वे तत्व भी ए node साथ में id="2" उनके बाद कहीं।

अधिक स्पष्ट परीक्षण दस्तावेज़ (और कानूनी) के साथ कार्रवाई में दिखाया गया id मान):

xml = "<root>
<node id="a"/><node id="b"/>
<node id="c">content</node>
<node id="d"/><node id="e"/><node id="f"/>
<node id="g">content</node>
<node id="h"/><node id="i"/>
</root>"

# A Ruby library that uses libxml2; http://nokogiri.org
require "nokogiri"; doc = Nokogiri::XML(xml)

expression = "//node[@id="c"]/following-sibling::node[following::node[@id="g"]]"
puts doc.xpath(expression)
#=> <node id="d"/>
#=> <node id="e"/>
#=> <node id="f"/>

जवाब के लिए 8 № 3

XPath 2.0 के पास ऑपरेटर "<<" और ">>" हैं जहां node1 << node2 यह सच है अगर नोड 1 दस्तावेज़ क्रम में नोड 2 से पहले है। तो एक XPSLT 2.0 स्टाइलशीट में XPath 2.0 के साथ जहां वर्तमान नोड नोड है [@id = "1") के आधार पर आप उपयोग कर सकते हैं

  following-sibling::node[not(text()) and . << current()/following-sibling::node[@od][1]]

यह भी XSLT से वर्तमान () समारोह की जरूरत है,इसलिए मैंने "XSLT 2.0 स्टाइलशीट में XPath 2.0 के साथ" कहा। ऊपर सिंटैक्स शुद्ध XPath है, एक XSLT स्टाइलशीट में आपको "<<" के रूप में "<<" से बचना होगा।