我正在使用 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>
However, during XLST, the <i>
tag gets ignored, so "Star Wars" is not italicized in the HTML output. Is there a relatively simple way to fix this?
你的问题就在这里:
<ul>
<xsl:for-each select="favoriteMovies/favoriteMovie">
<li><xsl:value-of select="."/></li>
</xsl:for-each>
</ul>
<xsl:value-of>
指令用于创建文本节点。这样做时,它会将 select
中指定的 XPath 表达式的字符串值复制到输出。此 XSLT 指令的属性。元素的字符串值是其所有文本节点后代的串联。
这就是您获得报告输出的方式。
解决方案:
使用 <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>
我是一名优秀的程序员,十分优秀!