我正在从 xml 文件创建 WordML 文档,该文件的元素有时包含 html 格式的文本。
<w:p>
<w:r>
<w:t> html formatted content is in here taken from xml file! </w:t>
</w:r>
</w:p>
这就是我的模板的设置方式。我有一个递归调用模板函数,可以对源 xml 内容进行文本替换。当遇到“<b>
“标签,我在CDATA中输出一个字符串,其中包含”</w:t></w:r><w:r><w:rPr><w:b/></w:rPr><w:t>
” 关闭当前运行并启动启用粗体格式的新运行。当它到达“</b>
“标签,它用下面的CDATA字符串替换它”</w:t></w:r><w:r><w:t>
".
我想做的是使用 XSL 关闭运行标记并开始新的运行,而不使用 CDATA 字符串插入。这可能吗?
使用 WordML 很棘手。使用 XSLT 将任意 XML 转换为 WordML 时的一个技巧是,不要担心处理块时的文本运行,而是创建一个直接匹配 text() 节点的模板,并在那里创建文本运行。事实证明,Word 并不关心您是否嵌套文本运行,这使得问题更容易解决。
<xsl:template match="text()" priority="1">
<w:r>
<w:t>
<xsl:value-of select="."/>
</w:t>
</w:r>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="para">
<w:p>
<xsl:apply-templates select="text() | *" />
</w:p>
</xsl:template>
<xsl:template match="b">
<w:r>
<w:rPr>
<w:b />
</w:rPr>
<w:t><xsl:apply-templates /></w:t>
</w:r>
</xsl:template>
这避免了直接将标签作为转义文本插入的不良 XSLT 技术。您最终会得到粗体标记作为嵌套文本运行,但正如我所说,Word 不在乎。如果您使用此技术,则需要小心不要将模板应用于段落之间的空白区域,因为它将触发文本模板并创建脱离上下文的运行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)