XSLT2。0使用变量vs直接选择选择特定于节点

XSLT2。0使用变量vs直接选择选择特定于节点,xslt,xslt-2.0,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" co

我试图在表单元格中处理每个规则,但在使用变量时,访问正确的属性值时遇到问题

我试图只处理底层规则(@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>

19.3%
如果我使用这个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>

2.
结果是“0.7056”,这是我正在寻找的,但是如果我在select中使用变量

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

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


我想知道为什么使用一个变量和一个特定的数字会产生不同,我该如何解决这个问题。

对于变量,您必须使用

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

在创建变量时,将“2”放在变量内,如下所示:

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

我认为它必须将变量视为字符串而不是整数,但有办法强制执行吗?好的,但这是绝对位置,还是具有@flags=b标准的节点内的位置?这是规则包含@flags=b的绝对位置。
<xsl:value-of select="rules/rule[tokenize(@flags,'\s+')='b'][$i]/@width"/>