我有以下 XML:
<node><mtype>code</mtype><mtext><script>
// a Javascript example
alert("Hello World");
</script></mtext></node>
HTML 中的相同文本将编写如下:
<pre><code><script>
// a Javascript example
alert("Hello World");
</script></code></pre>
我们可以看到实际的文本是 HTML 编码的,这很好。我接下来要做的是使用以下 XSLT 将上述 mtext 表示为<code>
Word XML 中的元素(具有特定样式)。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"
>
<xsl:template match="/">
<xsl:for-each select="/node">
<xsl:if test="mtype = 'code'">
<w:p>
<w:pPr><w:jc w:val="left" /></w:pPr>
<!--<xsl:text select="mtext/node()"/>-->
<w:r><w:t><xsl:value-of select="mtext/node()" disable-output-escaping="yes"/></w:t></w:r>
</w:p>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
如果我对定义的 XML 运行 XLST,我会得到以下信息:
$ xsltproc code.xslt code.xml
<?xml version="1.0"?>
<w:p xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"><w:pPr><w:jc w:val="left"/></w:pPr><w:r><w:t><script>
// a Javascript example
alert("Hello World");
</script></w:t></w:r></w:p>
这不是我想要达到的。首先是实际的特殊字符,更重要的是被删除的新行。我在<w:t>
元素中使用的任何内容都只在一行中可见,但我的<code>
文本有多行,这就是为什么我也需要多行。
我听说我可以使用<xsl:text>
or <![CDATA[ ... ]]>
,但我无法生成在 Microsoft Word 中实际创建多行部分的 XML。 <code>
编辑:雅各布,如果我使用它,我没有换行符。结束 XML 如下,不打印换行符:
<w:p wsp:rsidR="005963F5" wsp:rsidRDefault="00804A03" wsp:rsidP="00804A03" xml:space="preserve">
<w:pPr><w:jc w:val="left"/><w:pStyle w:val="VirisCode"/></w:pPr>
<w:r><w:t>
<script>
// a Javascript example
alert("Hello World");
</script>
</w:t></w:r>
</w:p>
评论:我不知道输出应该是什么样子,因为我不是 XML 专家;如果我知道我可能会自己写。因此,只要 XML 可以工作,它就可以看起来像它喜欢的任何东西。通过作品,我的意思是它<code>
以我想要的方式显示块。我希望代码块完全按照它们在<mtext>
XML 节点中的显示方式显示,包括新行和所有内容。在这种情况下,确切的输出(一旦已经用 Word 打开)应该显示如下:
<script>
// a Javascript example
alert("Hello World");
</script>
请注意,特殊字符显示正确,并且存在换行符。问题在于<w:t>
在一行中显示所有内容的元素,这是我不想要的,但不知道还能使用什么。