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" 匹配的模板。它添加了htmlbody 到输出。然后,必须为 observations 的内容。内置模板匹配observation, 什么都不做,而是寻找一个模板来处理它的内容。 对于a元素,匹配对应的模板,有 复制元素和属性。最后,一个内置的模板副本 observationa 中的文本节点。

<?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 你的意思是把它们输出为例如&amp;lt;html&amp;gt;?输入相同?目的是什么?

以上是关于XSLT 转换从混合内容中删除 HTML 元素的主要内容,如果未能解决你的问题,请参考以下文章

XSLT 删除 XML 的多个元素

如何使用 XSLT 从 XML 中删除元素标记

xslt 转换错误:XTSE0010:元素 xsl:mode 不得直接出现在 xsl:stylesheet 中

我可以使用 XSLT 将 OpenOffice ODT 内容 (content.xml) 转换为 HTML 吗?

需要 XSLT 转换以删除重复元素 - 按属性排序

XSLT - 动态添加元素