我有以下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表示为Word XML中的<code>
元素(具有特定样式)。
<?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>
如果我再次运行XLST定义的XML,我会得到以下结果:
$ 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>
或<![CDATA[ ... ]]>
,但我无法生成实际创建多行 {{1}的XML Microsoft Word中的部分。
编辑:雅各布,如果我使用它,我没有换行。结束XML如下,不打印换行符:
<code>
评论:我不知道输出应该是什么样的,因为我不是XML专家;如果我知道我可能会自己写这个。因此,只要有效,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>
块。我希望代码块的显示方式与<code>
XML节点中显示的完全相同,包括新行和所有内容。在这种情况下,确切的输出(一旦用Word打开)应显示以下内容:
<mtext>
请注意,特殊字符会正确显示并且存在换行符。问题在于<script>
// a Javascript example
alert("Hello World");
</script>
元素在一行中显示所有内容,这是我不想要的,但不知道还有什么可以使用。
答案 0 :(得分:1)
使用xsl:output,template,element或of lvl上的xml:space来保留换行符/空格。