我尝试处理表格单元格中的每条规则,并且在使用变量时遇到访问正确属性值的问题。
我试图只处理底层规则(@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。
我想知道为什么使用变量与特定数字会有所不同,以及我如何解决这个问题。
答案 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}}