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

在XSLT 1.0中使用WordML生成Word文档时添加换行的问题

解决XSLT 1.0生成WordML时的换行问题

你的问题出在把<w:br/>节点存入变量后用<xsl:value-of>输出——XSLT的value-of只会提取节点的字符串内容,这会把<w:br/>转义成文本(显示为&lt;w:br/&gt;),而不是作为WordML的换行标签被Word识别。

正确的实现方式

不需要用变量包裹结果,直接在模板中逐个输出Item1Value的值和对应的换行标签即可:

<!-- 调用模板的地方 -->
<w:t>
  <xsl:call-template name="concatItems">
    <xsl:with-param name="elements" select="Items[Item1Flag='Y']/Item1Value"/>
  </xsl:call-template>
</w:t>

<!-- 修改后的模板 -->
<xsl:template name="concatItems">
  <xsl:param name="elements"/>
  <xsl:for-each select="$elements">
    <!-- 输出当前Item1Value的值 -->
    <xsl:value-of select="."/>
    <!-- 对非最后一项添加WordML换行标签 -->
    <xsl:if test="position() != last()">
      <w:br/>
    </xsl:if>
  </xsl:for-each>
</xsl:template>

为什么原来的方法不生效?

你之前的代码把<w:br/>和值都放到了$result变量中,这个变量本质是一个节点集。当你用<xsl:value-of select="$result"/>时,XSLT会将整个节点集转换为字符串——也就是把所有标签都转义成文本格式,Word自然无法识别这些转义后的文本为换行指令。直接输出节点的话,WordML的结构会被保留,<w:br/>就能正确触发换行。

额外提示

如果你的WordML要求换行必须在<w:r>(文本 run)内部,确保每个值和换行都在对应的<w:r>里,比如:

<xsl:template name="concatItems">
  <xsl:param name="elements"/>
  <xsl:for-each select="$elements">
    <w:r>
      <w:t><xsl:value-of select="."/></w:t>
    </w:r>
    <xsl:if test="position() != last()">
      <w:r>
        <w:br/>
      </w:r>
    </xsl:if>
  </xsl:for-each>
</xsl:template>

这种写法更符合WordML的规范,避免出现格式异常。

内容的提问来源于stack exchange,提问作者Operagust

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:14:55