在XSLT 1.0中使用WordML生成Word文档时添加换行的问题
解决XSLT 1.0生成WordML时的换行问题
你的问题出在把<w:br/>节点存入变量后用<xsl:value-of>输出——XSLT的value-of只会提取节点的字符串内容,这会把<w:br/>转义成文本(显示为<w:br/>),而不是作为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
相关产品推荐
相关产品推荐

