XSLT:如何解析嵌入在 XML 标记中的 HTML

Posted

技术标签:

【中文标题】XSLT:如何解析嵌入在 XML 标记中的 HTML【英文标题】:XSLT: How to parse HTML embedded in XML tags 【发布时间】:2019-03-03 06:38:26 【问题描述】:

我遇到了这样的情况,即 XML 标记包含需要在 XSLT 中解析的 html 代码。这是 XML 示例:

<note>
    <text>&lt;p&gt;This is a paragraph.&lt;/p&gt;&lt;p&gt;This is another paragraph.&lt;/p&gt;</text>
</note>

我希望嵌入的段落元素存储在不同的变量中。

This is a paragraph. 应该存储在一个变量中,This is another paragraph. 应该存储在另一个变量中。

你能帮忙吗?

【问题讨论】:

您可以在标准 XSLT 3 中使用 parse-xml-fragment 执行此操作,示例请参见 xsltfiddle.liberty-development.net/bFDb2CQ。期望在简单的 XSLT 1.0 中一步完成这一点是大胆的,除非您有一个支持扩展的 XSLT 1.0 处理器或轻松地允许您实现一个可以访问 (X)HTML 解析器的处理器。 非常感谢!这就是我一直在寻找的。我将标签从xslt-1.0 更改为xslt-3.0 您可以将其发布为答案 【参考方案1】:

XSLT 3.0 支持使用 parse-xml https://www.w3.org/TR/xpath-functions/#func-parse-xml 解析 XML 文档或使用 parse-xml-fragment https://www.w3.org/TR/xpath-functions/#func-parse-xml-fragment 解析 XML 片段,在早期版本中,您必须依赖提供或可实现的处理器特定扩展。

您的转义代码看起来像一个 XHTML 片段,因此它应该可以使用 parse-xml-fragment 解析,就像在 https://xsltfiddle.liberty-development.net/bFDb2CQ 中一样

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output method="html" indent="yes" html-version="5"/>

  <xsl:template match="text">
      <div>
          <xsl:variable name="contents" select="parse-xml-fragment(.)"/>
          <xsl:variable name="p1" select="$contents/p[1]"/>
          <xsl:variable name="p2" select="$contents/p[2]"/>
          <xsl:sequence select="$p1, $p2"/>
      </div>
  </xsl:template>

</xsl:stylesheet>

【讨论】:

以上是关于XSLT:如何解析嵌入在 XML 标记中的 HTML的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 XSLT 删除重复标记及其在 XML 中的子项

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

Ruby XML, XSLT 和 XPath 教程

从 Saxon 9.4he 中的嵌入式资源加载 xml 和 xslt

如何使用 XSLT 在 xml 文件中查找元素并将其放置在另一个标记中?