Comment puis-je utiliser XPath pour compter le nombre de noeuds avec un certain attribut

je n'arrive pas à obtenir une expression XPath pour travailler pour mon scénario. Je veux trouver tous les noeuds "Device" qui ont le type "EndDevice". Je suis capable de compter tous les noeuds "Device", et je suis aussi capable de trouver tous les noeuds "Device" avec l'attribut "EndDevice". Cependant, je n'arrive pas à les combiner!

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

si c'est important, J'utilise XPathBuilder.

28
demandé sur Jason Young 2010-03-05 21:59:46

2 réponses

Je l'ai reproduit en utilisant XPathBuilder 2.0.0.4. Cependant L'expression XPath fonctionne et évalue correctement dans un évaluateur en ligne que j'ai essayé (http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm).

EDIT: également essayé avec la dernière version de Altova XMLspy

entrée:

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

sortie:

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

je pense que C'est XPathBuilder qui fait quelque chose de mal.

20
répondu Ledhund 2010-03-05 19:45:08

en utilisant le xml ci-dessus enregistré dans un test.xml et l'utilisation de l'outil http://kernowforsaxon.sourceforge.net/

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

produit la bonne sortie.

3
répondu Xavier John 2013-02-12 20:40:16