【问题标题】:XSLT transform removes HTML elements from mixed-contentXSLT 转换从混合内容中删除 HTML 元素
【发布时间】: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>

我已经阅读了一些关于 stackoverflow 的类似文章,并查看了维基百科上的身份转换页面;我开始使用 xsl:copy-of 获得一些有趣的结果,但我对 XSLT 的了解还不够,无法让嵌入在每个 XML 元素中的所有单词和标签出现在生成的 HTML 中。任何帮助将不胜感激。

【问题讨论】:

    标签: html xml xslt


    【解决方案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;?输入相同?目的是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2013-12-12
    • 2023-01-10
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多