Verwendung von Klammern in xpath/xslt
Ich versuche, die Klammern verwenden, um Standardwert außer Kraft setzen Rangfolge der in einem xpath-Ausdruck innerhalb eines xslt-ohne Erfolg. Zum Beispiel:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl"
version="1.0">
<xsl:output encoding="utf-8" standalone="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!--these should work but don't-->
<xsl:template match="//(X|Y|Z)/AABBCC"/>
<xsl:template match="(book/author)[last()]"/>
</xsl:stylesheet>
Visual Studio 2010 wird nicht kompiliert, diese Rückkehr:
Unerwartetes token '(' in Ausdruck. //-->(<-- X|Y|Z)/AABBCC
Unerwartetes token '(' in Ausdruck. -->(<-- book/author)[last()]
Noch das zweite Beispiel stammt aus der MSDN:
http://msdn.microsoft.com/en-us/library/ms256086.aspx
sowie zahlreiche Referenzen sagen Sie können Runde Klammern verwenden, auf diese Weise:
http://saxon.sourceforge.net/saxon6.5.3/expressions.html
http://www.stylusstudio.com/xsllist/200207/post90450.html
http://www.mulberrytech.com/quickref/XSLT_1quickref-v2.pdf
Ist das ein xpath 1.0 vs 2.0 Sache...oder ist es etwas, das mir fehlt? Wenn es eine xpath 2.0-Ding, ist es eine schöne xpath 1.0 Art und Weise zu tun, die gleiche Sache?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie verstehen, dass ein
match
Attribut einesxsl:template
nicht erlauben, jeden beliebigen XPath-Ausdruck, sondern nur sogenannte Muster: https://www.w3.org/TR/1999/REC-xslt-19991116#patterns, eine Teilmenge von XPath-Ausdrücken.So, während
(book/author)[last()]
ist eine syntaktisch korrekte XPath 1.0 Ausdruck ich glaube nicht, dass es eine syntaktisch korrekte XSLT 1.0-Muster, die Klammern sind nicht erlaubt.Ich glaube nicht, dass
//(X|Y|Z)/AABBCC
ist eine zulässige XPath-1.0-Ausdrucks (noch ein Muster natürlich), abermatch="X/AABBCC | Y/AABBCC | Z/AABBCC"
tun sollte.Siehe @Martin die Antwort der entscheidende Punkt: das gilt Muster sind nur eine Teilmenge der gültigen XPath-Ausdrücke. (Dies ist etwas, das über XSLT, dass es mir dauerte eine lange Zeit zu erkennen.)
Als gültige alternativen:
ist ein Gültiger Ausdruck in XPath 2.0, aber nicht in der 1.0, weil die Klammern nicht sofort beginnen, nachdem die
//
Achse. Aber in 1.0,ist eine gültige alternative Ausdruck ein (aber noch nicht zu einem gültigen Muster). Eine gültige, aber etwas umständlich Muster wäre
oder
Als für
gültige Muster wäre
(Aber natürlich
wäre nicht gleichwertig, denn es würde mit alle
<author>
Kinder der letzten<book>
dass hatte.)