代码之家  ›  专栏  ›  技术社区  ›  Jim Garrison

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

  •  2
  • Jim Garrison  · 技术社区  · 16 年前

    <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
    

    显然,我遗漏了一些关于属性节点如何原子化以便在谓词中使用的基本知识,但在docs(michaelkay的XSLT/XPATH 2.0,第4版)中找不到任何可以解释这种差异的内容。

    有人能解释一下为什么会发生这种情况,并指出在XSLT2.0规范或MichaelKay的书中,在哪里描述了这种情况吗?

    (XSLT处理器是Saxon PE 9.2.0.3)

    1 回复  |  直到 16 年前
        1
  •  1
  •   Dimitre Novatchev    16 年前

    显然我错过了什么 基本的

    .

    $datePrecision[@precision]
    

    方法 :中的所有元素 $datePrecision 具有名为 precision

    但是你想要 @precision 表示名为 与模板匹配的currnet节点的。

    XSLT提供 current() :

     $datePrecision[current()/@precision]
    

    更新 :正如Martin Honnen所暗示的,OP可能想把第五元素从 $日期精度 --从问题描述中看不到的东西。在这种情况下,可能需要使用:

     $datePrecision[position() = current()/@precision]
    
    推荐文章