XSLT转换会从混合内容中移除HTML元素。

3

在XML中保留锚点和其他嵌入式HTML标签,这是否可能?

背景:我正在尝试使用XSLT将HTML文档转换为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上读了几篇类似的文章,并查看了wikipedia上的身份变换页面;我开始使用xsl:copy-of得到一些有趣的结果,但我对XSLT的理解还不够,无法让每个XML元素中嵌入的所有单词和标签都出现在生成的HTML中。希望能得到帮助。

1个回答

2

请编写一个独立的模板来匹配 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标签? - Bruno Brant
@BrunoBrant 你的意思是将它们输出为例如 &lt;html&gt; 吗?使用相同的输入?出于什么目的? - Mathias Müller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接