使用XPathCompiler引用用户定义的xsl:function

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

我正在使用Saxon HE的XPathCompiler类对XML文件运行XPath查询,然后处理结果。我也有一个带有用户定义函数的XSL。有没有一种方法可以在XPath查询中引用这些用户定义的函数?我已经成功地从其他XSL引用了它们,但是当我只是从Saxon XPathCompiler对象自己执行XPath查询时,不确定该怎么做。

[基本上,我希望下面的代码中有一些方法可以指向DocOpsFunctions.xsl样式表并访问在那里定义的函数。

代码:

    Dim myProcessor As New Saxon.Api.Processor
    Dim myCompiler As XPathCompiler = myProcessor.NewXPathCompiler()
    myCompiler.XPathLanguageVersion = "3.1"
    Dim myDocBuilder As DocumentBuilder = myProcessor.NewDocumentBuilder
    Dim myDoc As XdmNode = myDocBuilder.Build(New Uri("input.xml"))
    Dim myResults As XdmValue
    myResults = myCompiler.Evaluate("dof:lefttrim('ISTeams/Team'", myDoc) 

DocOpsFunctions.xsl:

<xsl:transform version="3.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:dof="http://docops.com">
    <xsl:function name="dof:lefttrim" as="xs:string">
        <xsl:param name="text"/>
        <xsl:value-of select="replace($text, '^\s+', '')"/>
      </xsl:function>
</xsl:transform>

Input.xml:

<ISTeams>
<Team>Team1   </Team1>
<Team>Team2   </Team2>
</ISTeams>

我知道可以使用ExtensionFunction接口定义扩展功能,但是希望找到一种更动态地执行此操作的方法,以便可以在样式表中而不是代码中实现新功能。

.net xslt xpath saxon
1个回答
0
投票

确保使用visiblity="public"声明该函数为公共函数,然后可以在XPath 3.1中使用fn:transform

transform(map { 
 'stylesheet-location' : 'DocOpsFunctions.xsl', 
 'cache' : true(), 
 'delivery-format' : 'raw', 
 'initial-function' : QName('http://docops.com', 
 'lefttrim'), 
 'function-params' : ['  foo']
})?output
© www.soinside.com 2019 - 2024. All rights reserved.