2

给定

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

如预期的那样,返回一个包含一个值为“Timestamp”的文本节点的节点集。

稍后在模板中,上下文元素具有属性

@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

显然,我错过了有关如何将属性节点原子化以用于谓词的基本知识,但在文档(Michael Kay 的 XSLT/XPATH 2.0,第 4 版)中找不到任何可以解释这种差异的内容。

有人可以解释为什么会发生这种情况,并指出在 XSLT 2.0 规范或 Michael Kay 的书中描述的地方吗?

(XSLT 处理器是 Saxon-PE 9.2.0.3)

4

1 回答 1

1

显然我错过了一些基本的东西

的。XPath 表达式

$datePrecision[@precision]

意思是:其中的所有元素$datePrecision都有一个名为precision.

但是您要@precision指的precision是与模板匹配的 currnet 节点的命名属性。

XSLTcurrent()正是为此目的提供了该功能。使用

 $datePrecision[current()/@precision]

更新:正如 Martin Honnen 暗示的那样,OP 可能希望从第 5 个元素中取出$datePrecision- 从问题描述中无法立即看到的东西。在这种情况下,可能需要使用:

 $datePrecision[position() = current()/@precision]
于 2010-04-02T16:04:44.957 回答