You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于工作表创建状态动态引用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:39:39