2016-11-20 6 views
1

Ich möchte den Wert eines bestimmten Knotens abrufen, der durch das Attribut id angegeben wird. Aber das Verhalten meines XSL-Parsers Saxon ist nicht so, wie ich es erwartet habe.Vergleichen von Attributwerten in XPath

Das ist mein XSL-Code:

<xsl:template match="synonyme"> 
    <xsl:element name="corr"> 
     <xsl:value-of select="@connecteur" /> 
     <xsl:value-of select="/liste/connecteur[@[email protected]]/forme[1]" /> 
    </xsl:element> 
</xsl:template> 

ich abgestimmt nur einen Tag mit dem Namen synonyme, die ein connecteur Attribut hat. Mein Code gibt den Wert dieses Attributs aus.

Ich möchte auch den Wert eines anderen Knotens ausgeben, der ein id Attribut hat, das dem connecteur Attribut meines aktuell übereinstimmenden Tags synonyme entspricht. Aber für diese Abfrage werden nie Ergebnisse gefunden, die zweite value-of hat immer eine leere Ausgabe.

Wenn ich z. [@id='c160'], wo c160 ist genau die gleiche Sache, die von der ersten value-of ausgegeben wird, funktioniert es! Aber nicht im Vergleich zum @attribute meines passenden Knotens. Wie kann ich das beheben?

Die XML ist im Grunde

<liste><connecteur id="c160"><forme>foo</forme></connecteur> 
     <connecteur id="c161"><synonyme connecteur="c160" /></connecteur> 
</liste> 

und die erwartete Ausgabe anstelle des synonyme ist <corr>c160 foo</corr>.

Antwort

1

Das Prädikat Sie verwenden:

[@[email protected]] 

ist mit zwei Attribute für ein Element suchen - id und connecteur - mit gleichen Werten. Zur Suche nach einem Element mit einem id Attribut, dessen Wert entspricht dem Wert des connecteur Wert des aktuellen Elements, müssen Sie verwenden:

[@id=current()/@connecteur] 

See: https://www.w3.org/TR/xslt/#function-current


Eine bessere Lösung wäre zu definieren, ein Schlüssel wie:

<xsl:key name="ref" match="connecteur" use="@id" /> 

dann verwenden:

<xsl:value-of select="key('ref', @connecteur)/forme" /> 

, um den Querverweis aufzulösen.

Siehe: https://www.w3.org/TR/xslt/#key

Verwandte Themen