使用XSLT 2.0的fn:parse-xml-fragment函数是否可以替代?

时间:2018-09-05 19:27:51

标签: xml xslt xslt-2.0

我对这个XSLT世界是陌生的,在这种情况下,我们想使用XSLT 3.0版支持的功能fn:parse-xml-fragment()

但是,在我们的框架中,我们仍处于XSLT 2.0版,并且不允许将saxon.jar升级到9.6版。
在XSLT 2.0版中,是否还有其他方法可以达到与该功能相同的结果?

1 个答案:

答案 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规则的错误。