XSLT 2. 0选择节点特定的变量与直接选择

时间:2017-04-05 16:26:03

标签: xslt xslt-2.0

我尝试处理表格单元格中的每条规则,并且在使用变量时遇到访问正确属性值的问题。

我试图只处理底层规则(@flags =" b")。鉴于此xml

<?xml version="1.0" encoding="UTF-8"?>
<cell>
    <rules>
        <rule flags="t" width="0.3528" colour="black"/>
        <rule flags="b" width="0.3528" colour="black"/>
        <rule flags="b" width="0.7056" colour="none"/>
        <rule flags="b" width="0.3528" colour="black"/>
    </rules>
<para>19.3%</para>
</cell>

如果我使用这个xslt

 <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
   <xsl:template match="cell">
     <xsl:variable name="i">2</xsl:variable>
     <xsl:value-of select="child::rules/rule[contains(@flags, 'b')][2]/@width"/>
   </xsl:template>
</xsl:stylesheet>

结果是&#39; 0.7056&#39;,这是我正在寻找的,但如果我在我的选择中使用变量

     <xsl:value-of select="child::rules/rule[contains(@flags, 'b')][$i]/@width"/>

结果是&#39; 0.3528 0.7056 0.3528&#39;它抓取了我所有规则元素的width属性,而不仅仅是第二个,即使变量的值为2。

我想知道为什么使用变量与特定数字会有所不同,以及我如何解决这个问题。

2 个答案:

答案 0 :(得分:2)

当您通过放置&#34; 2&#34;来创建变量时在里面就像这样:

<xsl:variable name="i">2</xsl:variable>

您创建了result tree fragment

如果你这样创建:

<xsl:variable name="i" select="2"/>

它是一个实际数字,可以像在谓词中使用它一样使用。

关于xsl:value-of ...

的一些注释
  • 根据您的数据,使用contains()来测试flags属性可能不太准确。如果flags可以包含多个值,请考虑使用tokenize()
  • 尽管使用child::轴是可以的,但这并非绝对必要。

示例:

<xsl:value-of select="rules/rule[tokenize(@flags,'\s+')='b'][$i]/@width"/>

答案 1 :(得分:0)

对于您必须使用的变量

{{1}}