XPath에서 두 노드 사이의 HTML Nodes 가져오기

10011 단어
//div[@id="Recipe"]//h5[contains(text(),"Ingredients")]/following-sibling::p[count(.|//div[@id="Recipe"]//h5[contains(text(),"Method")]/preceding-sibling::p) = count(//div[@id="Recipe"]//h5[contains(text(),"Method")]/preceding-sibling::p)]
In XPath 1.0 one way to do this is by using the Kayessian method for node-set intersection:
$ns1[count(.|$ns2) = count($ns2)]

The above expression selects exactly the nodes that are part both of the node-set  $ns1  and the node-set  $ns2 .
To apply this to the specific question -- let's say we need to select all nodes between the 2nd and 3rd  h3  element in the following XML document:
<html> <h3>Title T31</h3> <a31/> <b31/> <h3>Title T32</h3> <a32/> <b32/> <h3>Title T33</h3> <a33/> <b33/> <h3>Title T34</h3> <a34/> <b34/> <h3>Title T35</h3> </html>

We have to substitute  $ns1  with:
/*/h3[2]/following-sibling::node()

and to substitute  $ns2  with:
/*/h3[3]/preceding-sibling::node()

Thus, the complete XPath expression is:
/*/h3[2]/following-sibling::node() [count(.|/*/h3[3]/preceding-sibling::node()) = count(/*/h3[3]/preceding-sibling::node()) ]

We can verify that this is the correct XPath expression:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:template match="/"> <xsl:copy-of select= "/*/h3[2]/following-sibling::node() [count(.|/*/h3[3]/preceding-sibling::node()) = count(/*/h3[3]/preceding-sibling::node()) ] "/> </xsl:template> </xsl:stylesheet>

When this transformation is applied on the XML document presented above, the wanted, correct result is produced:
<a32/> <b32/>

II. XPath 2.0 solution:
Use the  intersect  operator:
 /*/h3[2]/following-sibling::node() intersect /*/h3[3]/preceding-sibling::node()

좋은 웹페이지 즐겨찾기