web-dev-qa-db-fra.com

Comment utiliser XPath pour compter le nombre de nœuds avec un certain attribut

Je n'arrive pas à obtenir une expression XPath pour mon scénario. Je veux trouver tous les nœuds "Device" qui ont le type "EndDevice". Je suis capable de compter tous les nœuds "Device" et je peux également trouver tous les nœuds "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 cela importe, j'utilise XPathBuilder.

28
Jason Young

Je l'ai reproduit en utilisant XPathBuilder 2.0.0.4. Cependant, l'expression XPath fonctionne et s'é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 d'Altova XMLspy

contribution:

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

production:

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

21
Ledhund

Utiliser le xml ci-dessus enregistré dans un test.xml et utiliser l'outil http://kernowforsaxon.sourceforge.net/

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

Produit la bonne sortie.

3
Xavier John