С учетом
<xsl:variable name="datePrecision" as="element()*">
<p>Year</p>
<p>Month</p>
<p>Day</p>
<p>Time</p>
<p>Timestamp</p>
</xsl:variable>
Выражение
$datePrecision[5]
возвращает набор узлов, содержащий один текстовый узел со значением «Отметка времени», как и ожидалось.
Позже в шаблоне с элементом контекста, имеющим атрибут
@precision="5"
Я пробую следующие выражения, но все они возвращают пустую строку:
$datePrecision[@precision]
$datePrecision[number(@precision)]
$datePrecision[xs:decimal(@precision)]
Однако следующая последовательность делает то, что я хочу
<xsl:variable name="prec" select="number(@precision)"/>
... $datePrecision[$prec] ...
Используя отладчик Oxygen / XML, я подошел к моменту, когда выражение должно быть оценено, и отобразил следующее в окне просмотра:
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
Очевидно, я упустил кое-что фундаментальное о том, как узлы атрибутов распыляются для использования в предикате, но не могу найти ничего в документах (XSLT / XPATH 2.0, 4-е издание Майкла Кея), которые бы объяснили эту разницу.
Может кто-нибудь объяснить, почему это происходит, и указать мне, где, в спецификации XSLT 2.0 или в книге Майкла Кея, где это описано?
(XSLT-процессор - Saxon-PE 9.2.0.3)