我有一个包含格式化文本数据的xml元素:
<MESSAGE>
<TranslationReport>
Translation Report
==================
Contains errors ? true
Contains warnings ? false
There are 9 entries in the report
我希望我的xslt(输出到html)的结果与TranslationReport的内容完全匹配。 我所做的每件事都只需要一个数据(全部在一行 - 见下文)。这看起来很简单,但我在所有书籍和其他地方搜索过......
翻译报告==================包含错误?真包含 警告? false报告中有9个条目
答案 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
标记完全按照原样在浏览器中呈现文字。这是第一个选择愚蠢的例子:
<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>