XSLT: Attributwert als numerisches Prädikat verwendet
-
24-09-2019 - |
Frage
Da
<xsl:variable name="datePrecision" as="element()*">
<p>Year</p>
<p>Month</p>
<p>Day</p>
<p>Time</p>
<p>Timestamp</p>
</xsl:variable>
Der Ausdruck
$datePrecision[5]
Gibt eine nodeset einen Textknoten mit dem Wert „Timestamp“ enthält, wie erwartet.
Später in einer Vorlage, mit einem Context-Elemente mit einem Attribute
@precision="5"
Ich versuche, die folgenden Ausdrücke, aber alle Rückkehr eine leere Zeichenfolge:
$datePrecision[@precision]
$datePrecision[number(@precision)]
$datePrecision[xs:decimal(@precision)]
Allerdings ist die folgende Sequenz tut, was ich will
<xsl:variable name="prec" select="number(@precision)"/>
... $datePrecision[$prec] ...
Mit Oxygen / XML Debugger Ich habe bis zu dem Punkt, wo der gestuften Ausdruck zu bewerten ist und folgende in dem Überwachungsfenster angezeigt werden:
Expression Value Nodes/Values Set
-------------------------- --------------- -----------------------
$datePrecision[5] Node Set(1) #text Timestamp
@precision Node Set(1) precision 5
$datePrecision[@precision]
number(@precision) 5
$datePrecision[number(@precision)]
$prec 5
$datePrecision[$prec] Node Set(1) #text Timestamp
Natürlich habe ich verpasst etwas Grundsätzliches wie Attributknoten zur Verwendung in einem Prädikat zerstäubt werden, kann aber nichts in der Dokumentation (Michael Kay XSLT / XPath 2.0, 4. Aufl) finden, die diesen Unterschied erklären würde.
Kann jemand erklären, warum dies geschieht, und zeigen Sie mir, wo, entweder in der XSLT 2.0-Spezifikation oder Michael Kay Buch, wo dies beschrieben wird?
(der XSLT-Prozessor ist Saxon-PE 9.2.0.3)
Lösung
Natürlich habe ich etwas verpasst grundlegende
Ja . Der XPath-Ausdruck :
$datePrecision[@precision]
Hilfe :. Alle Elemente in $datePrecision
, die ein Attribut mit dem Namen precision
haben
Aber Sie wollen @precision
das Attribut mit dem Namen precision
der currnet Knoten bedeuten, die von der Vorlage angepasst ist.
XSLT stellt die current()
funktioniert genau für diesen Zweck. Mit
$datePrecision[current()/@precision]
UPDATE : Wie Martin Honnen angedeutet, will die OP wahrscheinlich aus $datePrecision
das fünfte Element bekommen - etwas nicht sofort sichtbar aus der Beschreibung des Problems. In diesem Fall kann es notwendig sein, zu verwenden:
$datePrecision[position() = current()/@precision]