web-dev-qa-db-ja.com

XPathを使用して特定の属性を持つノードの数をカウントする方法

私のシナリオで動作するXPath式を取得できないようです。タイプが「EndDevice」であるすべての「デバイス」ノードを検索したい。すべての「デバイス」ノードをカウントできます。また、「EndDevice」属性を持つすべての「デバイス」ノードを見つけることもできます。しかし、私はそれらを組み合わせることができないようです!

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

問題があれば、XPathBuilderを使用しています。

28
Jason Young

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だと思います。

21
Ledhund

Test.xmlに保存された上記のxmlを使用し、ツールを使用します http://kernowforsaxon.sourceforge.net/

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

適切な出力を生成します。

3
Xavier John