2010-03-05 23 views
27

Non riesco a ottenere un'espressione XPath per il mio scenario. Voglio trovare tutti i nodi "Device" che hanno il tipo "EndDevice". Sono in grado di contare tutti i nodi "Device" e sono anche in grado di trovare tutti i nodi "Device" con l'attributo "EndDevice". Tuttavia, non riesco a combinarli!Come utilizzare XPath per contare il numero di nodi con un determinato attributo

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

Se è importante, sto usando XPathBuilder.

+0

Cosa vuoi dire che il secondo "ha funzionato"? Corrispondeva ad alcuni nodi? Il tuo XPath sembra corretto quindi c'è qualcosa che non funziona in una sezione di codice che non stai mostrando, o nello strumento che stai usando. –

risposta

20

L'ho riprodotto usando XPathBuilder 2.0.0.4. Tuttavia l'espressione XPath funziona e valuta correttamente in un valutatore online che ho provato (http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm).

EDIT: provato anche con l'ultima versione di Altova XMLSpy

ingresso:

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

uscita:

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

credo che sia questo è XPathBuilder facendo un po ' cosa sbagliata.

+1

concordato. È probabile che si tratti di un problema con XPathBuilder. Ho testato XML/XSLT in oXygen usando Xalan, Saxon 6.5.5, Saxon HE 9.2.0.3 e ottenuto l'output desiderato. –

3

Utilizzando XML sopra salvati in un Test.xml e utilizzando lo strumento http://kernowforsaxon.sourceforge.net/

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

produce l'output destra.

Problemi correlati