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)

War es hilfreich?

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]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top