XSLT是否可以在XML中保留锚点和其他嵌入式HTML标记?
背景:我正在尝试使用XSLT将HTML文档转换为带有XSL样式表的XML。原始HTML文档的内容中散布着锚标记(例如,这里和那里有一些超链接)。我已将该内容复制到我的XML中,但XSLT输出缺少锚标记。
示例XML:
<?xml version="1.0" ?>
<observations>
<observation><a href="http://jwz.org">Hyperlinks</a> disappear.</observation>
</observations>
示例XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/html">
<xsl:output method="html" indent="yes" encoding="UTF-8"/>
<xsl:template match="/observations">
<html>
<body>
<xsl:value-of select="observation"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
输出:
<html xmlns="http://www.w3.org/1999/html">
<body>Hyperlinks disappear.</body>
</html>
我已经在stackoverflow上阅读了一些类似的文章,并检查了维基百科上的身份转换页面;我开始使用xsl:copy-of获得一些有趣的结果,但是我对XSLT不够了解,无法将每个XML元素中嵌入的所有单词和标签显示在结果HTML中。任何帮助将不胜感激。
答案 0 :(得分:2)
编写单独的模板以匹配a
元素,复制其属性和内容。
您的方法有什么问题?在您的代码中,
<xsl:value-of select="observation"/>
只需将observation
元素的字符串值发送到输出。它的字符串值是它包含的所有文本节点的串联。但是,您不仅需要其中的文本节点,还需要a
元素本身。
XSLT处理器的默认行为是&#34;跳过&#34;元素节点,因为内置模板。因此,如果您未在模板匹配中提及a
,则会忽略它,并仅输出其文本内容。
<强>样式表强>
注意:此样式表仍然在某种程度上依赖于XSLT处理器的默认行为。事件的顺序将类似于以下内容:
match="/observations"
匹配的模板。它增加了html
和body
到输出。然后,必须找到模板规则 内容observations
。内置模板与observation
匹配, 对它没有任何作用,并寻找模板来处理其内容。 对于a
元素,匹配相应的模板 复制元素和属性。最后,内置模板复制observation
和a
内的文本节点。
<?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" indent="yes" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/observations">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="a">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
XML输出
<html>
<body><a href="http://jwz.org">Hyperlinks</a> disappear.
</body>
</html>