XSLT:用作数字谓词的属性值

时间:2010-04-02 14:54:17

标签: xslt attributes predicate xslt-2.0

鉴于

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

返回一个nodeSet,其中包含一个值为“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)

1 个答案:

答案 0 :(得分:1)

  

显然我错过了什么   基本

即可。 XPath表达式

$datePrecision[@precision]

表示$datePrecision中所有具有precision属性的元素。

但您希望@precision表示与模板匹配的currnet节点名为precision的属性。

XSLT完全为此提供current()函数。使用

 $datePrecision[current()/@precision]

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

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