XSLT 转换从混合内容中删除 HTML 元素
Posted
技术标签:
【中文标题】XSLT 转换从混合内容中删除 HTML 元素【英文标题】:XSLT transform removes HTML elements from mixed-content 【发布时间】:2014-10-13 13:40:21 【问题描述】: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>
我已经阅读了一些关于 *** 的类似文章,并查看了***上的身份转换页面;我开始使用 xsl:copy-of 获得一些有趣的结果,但我对 XSLT 的了解还不够,无法让嵌入在每个 XML 元素中的所有单词和标签出现在生成的 HTML 中。任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:编写一个单独的模板来匹配a
元素,复制它们的属性和内容。
你的方法有什么问题?在您的代码中,
<xsl:value-of select="observation"/>
只需将observation
元素的字符串值 发送到输出。它的字符串值是它包含的所有文本节点的串联。但是您不仅需要其中的文本节点,还需要 a
元素本身。
由于内置模板,XSLT 处理器的默认行为是“跳过”元素节点。因此,如果您在模板匹配中没有提及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>
【讨论】:
终于了解了我的 XSLT 发生了什么,是否可以转义 XML 中的 HTML 标记? @BrunoBrant 你的意思是把它们输出为例如&lt;html&gt;
?输入相同?目的是什么?以上是关于XSLT 转换从混合内容中删除 HTML 元素的主要内容,如果未能解决你的问题,请参考以下文章
xslt 转换错误:XTSE0010:元素 xsl:mode 不得直接出现在 xsl:stylesheet 中