2010-03-05 64 views
27

Parece que no puedo obtener una expresión XPath para mi escenario. Quiero encontrar todos los nodos "Dispositivo" que tienen el tipo "Dispositivo final". Puedo contar todos los nodos "Dispositivo" y también puedo encontrar todos los nodos "Dispositivo" con el atributo "Dispositivo final". Sin embargo, parece que no puedo combinarlos.¿Cómo uso XPath para contar la cantidad de nodos con un determinado atributo?

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

Si es importante, estoy usando XPathBuilder.

+0

¿Qué quiere decir que el segundo "funcionó"? ¿Coincidió con algunos nodos? Su XPath parece correcto, por lo que hay algo que no funciona en una sección de código que no muestra o en la herramienta que está utilizando. –

Respuesta

20

Lo reproduje usando XPathBuilder 2.0.0.4. Sin embargo, la expresión XPath funciona y se evalúa correctamente en un evaluador en línea que probé (http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm).

EDIT: También probamos con la última versión de Altova XMLSpy

de entrada:

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

de salida:

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

creo que es eso XPathBuilder haciendo algo cosa mal

+1

De acuerdo. Es probable que sea un problema con XPathBuilder. Probé el XML/XSLT en oXygen usando Xalan, Saxon 6.5.5, Saxon HE 9.2.0.3 y obtuve el resultado deseado. –

3

Usando el código XML anterior guardado en un test.xml y el uso de la herramienta http://kernowforsaxon.sourceforge.net/

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

produce la salida derecha.

Cuestiones relacionadas