How would you find all nodes between two H3's using XPATH?
In XPath, there are seven kinds of nodes: element, attribute, text, namespace, processing-instruction, comment, and document nodes. XML documents are treated as trees of nodes. The topmost element of the tree is called the root element.
Xpath Node is defined as a point where the path address initiates, as it follows a concept of nodes. In simple terms they are the individual elements of the Xpath hierarchical structure which are termed as a node and enable an XSL processing. Xpath expressions could be done with HTML and XML.
Save. XPath is used to navigate in XML documents and it uses the expressions for navigation. Today I am going to discuss some key points about navigation(traversing) in XML Xpath. Forward Traversing: We can traverse forward in the XML XPath in the following ways.
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()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With