我是这个XSLT世界的新手,我们想要使用XSLT 3.0版支持的函数fn:parse-xml-fragment()
。
但是,在我们的框架中,我们仍处于XSLT版本2.0,不允许将saxon.jar
升级到版本9.6。
在XSLT 2.0版中,有没有其他方法可以实现与此函数相同的结果?
该函数是一个XPath 3.0 / 3.1函数https://www.w3.org/TR/xpath-functions-30/#func-parse-xml-fragment所以你会在支持XPath 3的XSLT处理器中找到它。根据你的Saxon版本和版本,如果你在样式表中使用version="3.0"
,即使你有一个版本,也可以使用它和/或版本的Saxon不支持最终的XSLT 3.0规范(例如,Saxon 9.8是第一个实施最终XSLT 3规范的Saxon主要版本,但是如果你使用parse-xml-fragment
,Saxon 9.7也支持像version="3.0"
这样的XPath 3函数你的XSLT代码,如果我没记错的话)。
您没有告诉我们您使用的处理器和版本及版本,可以使用或实现它作为扩展功能。
在纯XSLT 2中还有David Carlisle的HTML解析器https://github.com/davidcarlisle/web-xslt/blob/master/htmlparse/htmlparse.xsl,如果你使用false()
作为第三个参数,可以使用(或至少滥用)作为XML(片段)解析器,例如样式表
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:dpc="data:,dpc"
exclude-result-prefixes="#all">
<xsl:import href="https://raw.githubusercontent.com/davidcarlisle/web-xslt/master/htmlparse/htmlparse.xsl"/>
<xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<html>
<head>
<title>New Version!</title>
</head>
<xsl:apply-templates/>
</html>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="section[h2 = 'Test']/ul/li">
<xsl:copy>
<xsl:value-of select="count(dpc:htmlparse(., '', false())/node())"/>
</xsl:copy>
</xsl:template>
</xsl:transform>
在http://xsltransform.hikmatu.com/948Fn5t/2,在那里用作输入的片段中找到正确数量的子节点(例如
<li><![CDATA[<foo>foo 1</foo><bar>bar 1</bar><foo>foo 2</foo>]]></li>
<li><![CDATA[text<element/>text<element>...</element>text]]></li>
计数3和5个节点),与parse-xml-fragment
在撒克逊9.8的https://xsltfiddle.liberty-development.net/eiZQaFH中所做的相同。
然而,您会发现htmlparse
函数可能会解析格式错误的标记,而parse-xml-fragment
函数会为不遵循外部解析实体的XML规则的任何内容提供错误。