如何使用XPath计算具有特定属性的节点数

时间:2010-03-05 18:59:46

标签: xpath count

我似乎无法让XPath表达式适用于我的场景。我想找到所有类型为“EndDevice”的“Device”节点。我能够计算所有“设备”节点,并且我还能够找到具有“EndDevice”属性的所有“设备”节点。但是,我似乎无法将它们结合起来!

count(//Device) //works
//Device[@xsi:type='EndDevice'] //works
count(//Device[@xsi:type='EndDevice']) //doesn't work

如果重要,我正在使用XPathBuilder。

2 个答案:

答案 0 :(得分:21)

我使用XPathBuilder 2.0.0.4复制它。 但是,XPath表达式在我尝试的在线评估器中正常工作和评估(http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm)。

编辑:还尝试使用最新版本的Altova XMLspy

输入:

<?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>

输出:

<?xml version="1.0" encoding="UTF-8"?>
<output xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xsi="n/a">4</output>

我认为这是XPathBuilder做错了什么。

答案 1 :(得分:3)

使用上面的xml保存到test.xml并使用工具http://kernowforsaxon.sourceforge.net/

declare namespace xsi="n/a"; 
count(doc('test.xml')//Device[@xsi:type = "EndDevice"])

产生正确的输出。