How do I use XPath to count the number of nodes with a certain attribute
Solution 1
I reproduced it using XPathBuilder 2.0.0.4. However the XPath expression works and evaluates correctly in an online evaluator I tried (http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm).
EDIT: Also tried with latest version of Altova XMLspy
input:
<?xml version="1.0"?>
<asdf xmlns:xsi="n/a">
<Device xsi:type='EndDevice'/>
<Device xsi:type='EndDevice'/>
<Device xsi:type='EndDevice'/>
<Device xsi:type='EndDevice'/>
</asdf>
xslt:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xsi="n/a">
<xsl:output indent="yes"/>
<xsl:template match="*">
<output>
<xsl:value-of select="count(//Device[@xsi:type = 'EndDevice'])"/>
</output>
</xsl:template>
</xsl:stylesheet>
output:
<?xml version="1.0" encoding="UTF-8"?>
<output xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xsi="n/a">4</output>
I think it's XPathBuilder thats doing something wrong.
Solution 2
Using the above xml saved into a test.xml and using the tool http://kernowforsaxon.sourceforge.net/
declare namespace xsi="n/a";
count(doc('test.xml')//Device[@xsi:type = "EndDevice"])
Produces the right output.
Jason Young
I help developers create incredible cloud applications. Follow me on twitter here. Microsoft employee, my opinions are my own.
Updated on February 13, 2020Comments
-
Jason Young over 4 years
I can't seem to get an XPath expression to work for my scenario. I want to find all the "Device" nodes that have the type "EndDevice". I'm able to count all the "Device" nodes, and I'm also able to find all "Device" nodes with the "EndDevice" attribute. However, I can't seem to combine them!
count(//Device) //works //Device[@xsi:type='EndDevice'] //works count(//Device[@xsi:type='EndDevice']) //doesn't work
If it matters, I'm using XPathBuilder.