对于使用XSLT 2.0的函数fn:parse-xml-fragment有什么替代方法吗?

问题描述 投票:1回答:1

我是这个XSLT世界的新手,我们想要使用XSLT 3.0版支持的函数fn:parse-xml-fragment()

但是,在我们的框架中,我们仍处于XSLT版本2.0,不允许将saxon.jar升级到版本9.6。 在XSLT 2.0版中,有没有其他方法可以实现与此函数相同的结果?

xml xslt xslt-2.0
1个回答
2
投票

该函数是一个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规则的任何内容提供错误。

© www.soinside.com 2019 - 2024. All rights reserved.