2009-03-05 4 views
2

Lassen Sie uns sagen, ich habe die folgende XML-DateiXSLT - Passende Knoten, dass ein bestimmter Knoten in sich haben (wie jQuery „: hat“)

<a id="123"> 
    <b type="foo" value="1" /> 
    <b type="baz" value="1" /> 
</a> 
<a id="789"> 
    <b type="bar" value="12" /> 
</a> 
<a id="999"> 
    <b type="foo", value="2" /> 
</a> 

ich eine Liste aller ‚a‘ erhalten möchten Knoten, die einen Unterknoten 'b' mit einem Typ = "foo" und Wert = "1" haben. Sie können in jQuery mit dem Selektor ": has" etwas Ähnliches tun.

Für den Rekord plane ich auf der Kommandozeile xmlstarlet verwenden (aber ich bin nicht damit verheiratet), so wäre eine xslt, die auf diese Weise funktioniert, am besten.

Antwort

6

etwas wie folgt aus:

a[b[@type='foo'][@value='1']] 

sollte der Trick

+1

Ich wusste nicht, dass Sie Knoten [Knoten [etwas] tun können, das ist eine elegante und saubere Möglichkeit, es zu tun. :) – Rory

-1
<xsl:variable name="nodeList" select="a[b[@type='foo' and @value=1]]"/> 

<xsl:for-each select="$nodeList"> 
    <xsl:value-of select="."/> 
</xsl:for-each> 
+0

Du hast die/b [@ type = 'foo' und @ value = 1]] von Maurice Perry, aber es ist komplizierter und wortreicher als ich gesucht habe. – Rory

+0

Fair genug, wenn es komplizierter ist, als Sie wollen, aber ich kopierte es nicht von einem anderen SO-Benutzer –

+0

Das OP will eine "Liste von 'a' Knoten" "- keine Liste der Zeichenfolge Wert der" a "Knoten. –

0

Ich denke, das wäre:/b [@ type = 'foo' und @ value = 1]/parent: : a

+0

Dies ist nicht die Antwort.Dieser XPath-Ausdruck wählt nur den * top * -Knoten aus wenn der Name "b" ist. Der oberste Knoten ist ein einzelner Knoten und hat niemals einen übergeordneten Knoten, der auch ein Element ist. –

2

Dies kann mit einem einzelnen XPath-Ausdruck erfolgen, wie in der Antwort von gizmo angegeben.

Weil die Frage speziell für XSLT ist, hier ist eine effiziente XSLT Lösung mit den Tasten:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes"/> 
<!--          --> 
<xsl:key name="kAByBTypeVal" 
    match="a" 
    use="concat(b/@type,'+',b/@value)"/> 
<!--          -->  
    <xsl:template match="/"> 
     <xsl:copy-of select= 
     "key('kAByBTypeVal', 'bar+12')"/> 
    </xsl:template> 
</xsl:stylesheet> 

Wenn die obige Transformation auf diesem XML-Dokument angewendet wird:

<t> 
    <a id="123"> 
     <b type="foo" value="1" /> 
     <b type="baz" value="1" /> 
    </a> 
    <a id="789"> 
     <b type="bar" value="12" /> 
    </a> 
    <a id="999"> 
     <b type="foo" value="2" /> 
    </a> 
</t> 

das korrekte Ergebnis wird:

produziert
<a id="789"> 
    <b type="bar" value="12"/> 
</a> 
Verwandte Themen