我正在使用XSLT将XML转换为HTML。我无法弄清楚如何处理嵌入式XML节点的格式化。例如,假设我有XML元素:
<favoriteMovie>the <i>Star Wars</i> saga</favoriteMovie>
但是,在XLST期间,<i>
标记被忽略,因此“星球大战”在HTML输出中没有斜体。是否有一种相对简单的方法来解决这个问题?
的test.xml:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="test.html.xsl"?>
<favoriteMovies>
<favoriteMovie>the <i>Star Wars</i> saga</favoriteMovie>
</favoriteMovies>
test.html.xsl:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" omit-xml-declaration="yes" />
<xsl:template match="/">
<html>
<head />
<body>
<ul>
<xsl:for-each select="favoriteMovies/favoriteMovie">
<li><xsl:value-of select="." /></li>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:11)
但是,在XLST期间,
<i>
标记会获得 被忽略了,所以“星球大战”不是 HTML输出中的斜体。是 有一个相对简单的方法来修复 此?
您的问题在这里:
<ul> <xsl:for-each select="favoriteMovies/favoriteMovie"> <li><xsl:value-of select="."/></li> </xsl:for-each> </ul>
<xsl:value-of>
指令用于创建文本节点。这样做时,它会将此XSLT指令的select
属性中指定的XPath表达式的字符串值复制到输出。元素的字符串值是其所有文本节点后代的串联。
所以这就是你得到报告输出的方式。
<强>解决方案强>:
使用<xsl:copy-of>
指令,该指令复制其select
属性中指定的所有节点:
<ul>
<xsl:for-each select="favoriteMovies/favoriteMovie">
<li><xsl:copy-of select="node()"/></li>
</xsl:for-each>
</ul>
另一个更符合XSLT原则的解决方案可以避免使用<xsl:for-each>
:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<html>
<head />
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="/*">
<ul>
<xsl:apply-templates/>
</ul>
</xsl:template>
<xsl:template match="favoriteMovie">
<li><xsl:copy-of select="node()"/></li>
</xsl:template>
</xsl:stylesheet>
当上面定义的两个解决方案中的任何一个应用于提供的XML文档时:
<favoriteMovies>
<favoriteMovie>the
<i>Star Wars</i> saga
</favoriteMovie>
</favoriteMovies>
产生了想要的正确结果:
<html>
<head/>
<body>
<ul>
<li>the
<i>Star Wars</i> saga
</li>
</ul>
</body>
</html>
答案 1 :(得分:2)
您应该使用xsl:copy复制i节点。
http://msdn.microsoft.com/en-us/library/ms256128.aspx
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" omit-xml-declaration="yes" />
<xsl:template match="/">
<html>
<head />
<body>
<xsl:apply-templates></xsl:apply-templates>
</body>
</html>
</xsl:template>
<xsl:template match="favoriteMovies">
<ul>
<xsl:apply-templates></xsl:apply-templates>
</ul>
</xsl:template>
<xsl:template match="favoriteMovie">
<li>
<xsl:apply-templates></xsl:apply-templates>
</li>
</xsl:template>
<xsl:template match="i">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:2)
你应该使用&#39; disable-output-escaping&#39;属性。元素的一般格式是:
<xsl:value-of select="expression" disable-output-escaping="yes|no" />
&#39;禁用输出转义&#39;是可选的。 &#34;是&#34;表示应按原样输出特殊字符(如&#34;&lt;&#34;)。 &#34;无&#34;表示特殊字符(如&#34;&lt;&#34;)应输出为&#34;&lt;&#34;。默认为&#34;否&#34;。
因此,只需将代码更改为:
<xsl:template match="favoriteMovie">
<xsl:copy-of select="node()" disable-output-escaping="yes"/>
</xsl:template>
答案 3 :(得分:-7)
有两点需要注意。
首先。确保标签在CDATA中被筛选
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="test.html.xsl"?>
<favoriteMovies>
<favoriteMovie><![CDATA[the <i>Star Wars</i> saga]]></favoriteMovie>
</favoriteMovies>
二。禁用输出转义:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" omit-xml-declaration="yes" />
<xsl:template match="/">
<html>
<head />
<body>
<ul>
<xsl:for-each select="favoriteMovies/favoriteMovie">
<li><xsl:value-of select="." disable-output-escaping="yes" /></li>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
编辑:使用编辑器管理它,现在代码显示为它应该
EDIT2:包含代码中的更改
EDIT3:对于它可能涉及的人,问题的关键在于构建电影信息,而不是html数据。 HTML仅用于标记目的,想象在favoriteMovie中有 html 标题标记,而相同的命名标记标题可以是 movies 数据库中的有效标记。这些标题的清晰度必须以不同的方式解释。这证明使用CDATA然后在处理时禁用输出。