2010-03-05 12 views
27

Ich kann nicht scheinen, einen XPath-Ausdruck für mein Szenario zu erhalten. Ich möchte alle "Device" -Knoten finden, die den Typ "EndDevice" haben. Ich kann alle "Device" -Knoten zählen, und ich bin auch in der Lage, alle "Device" -Knoten mit dem "EndDevice" -Attribut zu finden. Jedoch kann ich nicht scheinen, sie zu kombinieren!Wie verwende ich XPath, um die Anzahl der Knoten mit einem bestimmten Attribut zu zählen

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

Wenn es wichtig ist, verwende ich XPathBuilder.

+0

Was meinst du damit, dass der zweite "funktioniert"? Entsprach es einigen Knoten? Ihr XPath sieht korrekt aus, so dass etwas in einem Codeabschnitt, den Sie nicht anzeigen, oder in dem von Ihnen verwendeten Tool nicht funktioniert. –

Antwort

20

Ich reproduziert es mit XPathBuilder 2.0.0.4. Der XPath-Ausdruck funktioniert jedoch korrekt und wird in einem Online-Evaluator ausgewertet, den ich ausprobiert habe (http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm).

EDIT: Auch mit der neuesten Version von Altova XMLSpy versucht

Eingang:

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

Ausgang:

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

Ich denke, es XPathBuilder das ist ist etwas tun Ding falsch.

+1

Einverstanden. Es ist wahrscheinlich ein Problem mit XPathBuilder. Ich habe das XML/XSLT in oXygen mit Xalan, Saxon 6.5.5, Saxon HE 9.2.0.3 getestet und die gewünschte Ausgabe erhalten. –

3

Unter Verwendung der oben xml in eine test.xml gespeichert und mit Hilfe des Werkzeugs http://kernowforsaxon.sourceforge.net/

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

die richtige Ausgabe erzeugt.

Verwandte Themen