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><p>This is a paragraph.</p><p>This is another paragraph.</p></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的主要内容,如果未能解决你的问题,请参考以下文章