XSLT转换从混合内容中删除HTML元素

时间:2014-08-20 08:58:46

标签: html xml xslt

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中。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

编写单独的模板以匹配a元素,复制其属性和内容。

您的方法有什么问题?在您的代码中,

<xsl:value-of select="observation"/>

只需将observation元素的字符串值发送到输出。它的字符串值是它包含的所有文本节点的串联。但是,您不仅需要其中的文本节点,还需要a元素本身。

XSLT处理器的默认行为是&#34;跳过&#34;元素节点,因为内置模板。因此,如果您未在模板匹配中提及a,则会忽略它,并仅输出其文本内容。

<强>样式表

注意:此样式表仍然在某种程度上依赖于XSLT处理器的默认行为。事件的顺序将类似于以下内容:

  

match="/observations"匹配的模板。它增加了html   和body到输出。然后,必须找到模板规则   内容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>