XSLT: значение атрибута, используемое в качестве числового предиката - PullRequest
2 голосов
/ 02 апреля 2010

С учетом

<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)

1 Ответ

1 голос
/ 02 апреля 2010

Очевидно, я что-то пропустил фундаментальный

Да . Выражение XPath :

$datePrecision[@precision]

означает : все элементы в $datePrecision, имеющие атрибут с именем precision.

Но вы хотите, чтобы @precision означал атрибут с именем precision узла currnet, которому соответствует шаблон.

XSLT обеспечивает функцию current() именно для этой цели. Используйте

 $datePrecision[current()/@precision]

ОБНОВЛЕНИЕ : Как намекнул Мартин Хоннен, ОП, вероятно, хочет получить 5-й элемент из $datePrecision - что-то не сразу видно из описания проблемы. В этом случае может потребоваться использовать:

 $datePrecision[position() = current()/@precision]
...