我对这个XSLT世界是陌生的,在这种情况下,我们想使用XSLT 3.0版支持的功能fn:parse-xml-fragment()
。
但是,在我们的框架中,我们仍处于XSLT 2.0版,并且不允许将saxon.jar
升级到9.6版。
在XSLT 2.0版中,是否还有其他方法可以达到与该功能相同的结果?
答案 0 :(得分:2)
该函数是XPath 3.0 / 3.1函数https://www.w3.org/TR/xpath-functions-30/#func-parse-xml-fragment,因此您可以在支持XPath 3的XSLT处理器中找到它。根据您的Saxon版本和版本,如果使用{{1},则可能可以使用它。 },即使您使用的Saxon版本不支持最终的XSLT 3.0规范(例如,Saxon 9.8是第一个主要的Saxon主要版本,都实现了最终的XSLT 3规范,但XPath 3函数,例如{如果您在XSLT代码中使用version="3.0"
(如果我没记错的话),那么Saxon 9.7也支持{1}}。
您还没有告诉我们您到底使用了哪个处理器,版本和版本,因此有可能使用或实现它作为扩展功能。
在纯XSLT 2中还有David Carlisle的HTML解析器https://github.com/davidcarlisle/web-xslt/blob/master/htmlparse/htmlparse.xsl,如果您将parse-xml-fragment
用作第三个参数,则可以用作XML(片段)解析器(或至少被滥用)。实例样式表
version="3.0"
在http://xsltransform.hikmatu.com/948Fn5t/2的在其中用作输入的片段中找到正确数量的子节点(例如
false()
包含3和5个节点),与<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>
在https://xsltfiddle.liberty-development.net/eiZQaFH中使用Saxon 9.8所做的相同。
但是,您会发现 <li><![CDATA[<foo>foo 1</foo><bar>bar 1</bar><foo>foo 2</foo>]]></li>
<li><![CDATA[text<element/>text<element>...</element>text]]></li>
函数可能会解析格式错误的标记,而parse-xml-fragment
函数则会为您发现任何不遵循外部解析实体的XML规则的错误。