如何基于工作表创建状态动态引用Worksheet?(附XSL代码片段)
解决XSLT中Worksheet引用与变量属性绑定的问题
先看你当前代码里的一个关键问题:在<Row ss:Index="$cnt">这一行,直接把变量$cnt写在属性值里是无效的。XSLT中要在属性中使用变量的值,必须用属性值模板——把变量放在大括号{}里,这样处理器才会解析变量的值,而不是把$cnt当作字符串处理。
修正后的核心代码片段
<Worksheet ss:Name="RELATÓRIO"> <Table> <ss:Column ss:Width="300"/> <xsl:for-each select="RELATORIO/MODULO"> <xsl:choose> <xsl:when test="NAME='ObtemIdentificacao_P'"> <xsl:variable name="cnt" select="position() + 1"/> <Row ss:Index="{$cnt}"> <!-- 这里填充你的Row内容 --> </Row> </xsl:when> </xsl:choose> </xsl:for-each> </Table> </Worksheet>
结合工作表存在状态的扩展逻辑
既然你已经实现了判断工作表是否创建的逻辑,我们可以把这个判断整合进来,分两种情况处理:
情况1:工作表未创建,完整生成Worksheet结构
<xsl:if test="not(已创建的工作表判断条件)"> <Worksheet ss:Name="RELATÓRIO"> <Table> <ss:Column ss:Width="300"/> <!-- 这里添加初始行或者遍历生成行的逻辑 --> <xsl:for-each select="RELATORIO/MODULO"> <xsl:if test="NAME='ObtemIdentificacao_P'"> <xsl:variable name="cnt" select="position() + 1"/> <Row ss:Index="{$cnt}"> <!-- Row内容 --> </Row> </xsl:if> </xsl:for-each> </Table> </Worksheet> </xsl:if>
情况2:工作表已存在,仅引用或追加内容
如果是要向已存在的工作表追加行,你可以定位到已有的Worksheet[@ss:Name='RELATÓRIO']/Table节点,然后在里面添加新的Row:
<xsl:if test="已创建的工作表判断条件"> <xsl:for-each select="RELATORIO/MODULO[NAME='ObtemIdentificacao_P']"> <xsl:variable name="cnt" select="position() + 已存在的行数 + 1"/> <Row ss:Index="{$cnt}"> <!-- 追加的Row内容 --> </Row> </xsl:for-each> </xsl:if>
关键要点总结
- 记住属性值模板的用法:所有需要动态赋值的属性,都要用
{变量名}的形式,而不是直接写变量。 - 结合你的工作表存在判断逻辑,分分支处理创建新表和追加内容的场景,避免重复创建工作表。
- 变量
$cnt的计算可以直接用select属性简化,不用嵌套<xsl:value-of>,这样代码更简洁高效(比如<xsl:variable name="cnt" select="position() + 1"/>)。
内容的提问来源于stack exchange,提问作者Gustavo Jose
相关产品推荐
相关产品推荐

