XSLT - 输出到html包含格式化文本的特定XML元素 - 输出应该相同

时间:2011-07-21 19:29:49

标签: html xml xslt transformation

我有一个包含格式化文本数据的xml元素:

   <MESSAGE>
      <TranslationReport>
Translation Report
==================
Contains errors ? true
Contains warnings ? false
There are 9 entries in the report

我希望我的xslt(输出到html)的结果与TranslationReport的内容完全匹配。 我所做的每件事都只需要一个数据(全部在一行 - 见下文)。这看起来很简单,但我在所有书籍和其他地方搜索过......

  

翻译报告==================包含错误?真包含   警告? false报告中有9个条目

3 个答案:

答案 0 :(得分:1)

您是否尝试过<xsl:output method="text"/> tag和/或在<xsl:text>...</xsl:text> tags中附上文字文字?

如果您使用HTML呈现结果,则问题是HTML不会在不将输出封装在tag like <pre>中的情况下呈现换行符。在XSLT中输出包裹文本输出的<pre>标记。

答案 1 :(得分:0)

您遇到的问题可能与以下事实有关:在XML中,不同形式的空白区域(换行符,空格等)被认为是等效的。请参阅此答案:Is it "bad practice" to be sensitive to linebreaks in XML documents?

答案 2 :(得分:0)

如果你要渲染到html,你有两个选择:

  • 使用pre标记完全按照原样在浏览器中呈现文字。
  • 使用一些高级XPath 2.0函数解析文本,并根据需要处理每个文本行。

这是第一个选择愚蠢的例子:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="html"/>

    <xsl:template match="MESSAGE/TranslationReport">
        <html>
            <body>
                <pre>
                    <xsl:value-of select="."/>
                </pre>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

在第二个选项中,我们将使用XPath 2.0函数tokenize解析您的文本,拆分所有行并用eanted标记包装每个行。

这是一个愚蠢的例子:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="html"/>

    <xsl:template match="MESSAGE/TranslationReport">
        <html>
            <body>
                <xsl:for-each select="tokenize(.,'\n')
                    [not(position()=(1,last()))]">
                    <p class="TranslationReport">
                        <xsl:value-of select=".[position()]"/>
                    </p>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

在第二种情况下,输出将是:

<html>
    <body>
        <p class="TranslationReport">Translation Report</p>
        <p class="TranslationReport">==================</p>
        <p class="TranslationReport">Contains errors ? true</p>
        <p class="TranslationReport">Contains warnings ? false</p>
        <p class="TranslationReport">There are 9 entries in the report</p>
    </body>
</html>