【发布时间】:2011-05-04 23:23:04
【问题描述】:
我尝试像这样替换标签:
<node><br></node> -- > <node><br></node>
不幸的是,当 xsl 解析我实际得到的 xml 文件时
<br>
显示在页面上,而不是作为标记显示。
【问题讨论】:
-
好问题,+1。请参阅我的答案以获得完整的解决方案。
我尝试像这样替换标签:
<node><br></node> -- > <node><br></node>
不幸的是,当 xsl 解析我实际得到的 xml 文件时
<br>
显示在页面上,而不是作为标记显示。
【问题讨论】:
HTML 不是 XML,尽管它们看起来非常相似;在 HTML 中有四件事是有效的,而您不能用 XML 做这些事情,所有这些都可以修改为与 XML 兼容:
&lt;br&gt; 到 <br/> 等。<input type="checkbox" checked>。只需为它们分配一个与属性同名的值,即<input type="checkbox" checked="checked" />。<b>A<i>B</b>C</i> 是合法的,这将使 A 变为粗体、C 为斜体,B 为粗体和斜体。您可以通过 <b>A<i>B</i></b><i>C</i> 或 <b>A</b><i><b>B</b>C</i> 使此 XML 兼容。&lt;、&gt;、&amp;、&quot;、&apos; 和 unicode 值(例如 &#160;/&#xA0;)是 XML 中的有效实体。默认情况下,您不能使用&nbsp; 或&oslash; 或类似的东西。要解决此问题,您需要在工作表顶部包含实体声明,例如 <!ENTITY nbsp "&#160;">。XSLT 无法处理 HTML 文件,除非它也是有效的 XML。
通常,我总是将 HTML 编写为与 XML 兼容,仅仅是因为它使所有 XML 工具都可用,而且真的没有理由不这样做。
将&lt;br&gt; 替换为&lt;br&gt; 实际上是将标签替换为恰好类似于html 的TEXT,而不是符合xml 的标签。
【讨论】:
method="html" 的输出“始终符合 XML”的说法是不正确的。话虽如此,否则您的答案非常好。
如果您想插入格式不正确的 html,这是一种可能的解决方法。 将格式不正确的 html 放在 xml 内的注释中,然后从 xsl 中提取它。
XML 示例:
<Data>
<!--
<div>
not well-formed xml<br>
</div>
-->
</Data>
XSL 示例:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:template match="Data">
<html>
<body>
<xsl:value-of disable-output-escaping="yes" select="comment()"/>
</body>
</html>
</xsl:template>
<xsl:template match="text() | @*">
</xsl:template>
</xsl:stylesheet>
输出
<html>
<body>
<div>
not well-formed xml<br>
</div>
</body>
</html>
【讨论】:
将它们保留为 <br/> 并编写适当的 XSLT 转换以将它们按原样映射到输出。
【讨论】:
您提供的文字:
<node><br></node>
不是格式良好的 XML 文档,不适合使用 XSLT 1.0 进行处理。
如果你有:
<node><br/></node>
然后简单地输出 <br/> 元素“原样”——那么它就是一个有效的标记。
示例:
这种转变:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="nodes">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
<xsl:template match="node">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
</xsl:stylesheet>
应用于此 XML 文档时:
<nodes>
<node>
1 <br/>
2 <br/>
3 <br/>
</node>
</nodes>
产生:
<html>
<p>
1 <br>
2 <br>
3 <br></p>
</html>
这在浏览器中显示为:
1
2
3
【讨论】: