0

我有以下 XML:

<node><mtype>code</mtype><mtext>&lt;script&gt;
 // a Javascript example
 alert("Hello World");
 &lt;/script&gt;</mtext></node>

HTML 中的相同文本将编写如下:

<pre><code>&lt;script&gt;
 // a Javascript example
 alert("Hello World");
 &lt;/script&gt;</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>
     &lt;script&gt;
     // a Javascript example
     alert("Hello World");
     &lt;/script&gt;
 </w:t></w:r>
</w:p>

评论:我不知道输出应该是什么样子,因为我不是 XML 专家;如果我知道我可能会自己写。因此,只要 XML 可以工作,它就可以看起来像它喜欢的任何东西。通过作品,我的意思是它<code>以我想要的方式显示块。我希望代码块完全按照它们在<mtext>XML 节点中的显示方式显示,包括新行和所有内容。在这种情况下,确切的输出(一旦已经用 Word 打开)应该显示如下:

<script>
// a Javascript example
alert("Hello World");
</script>

请注意,特殊字符显示正确,并且存在换行符。问题在于<w:t>在一行中显示所有内容的元素,这是我不想要的,但不知道还能使用什么。

4

1 回答 1

1

在 xsl:output、模板、元素或 lvl 的值上使用 xml:space 来保留换行符/空格。

于 2012-12-04T13:48:43.580 回答