我正在使用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接口定义扩展功能,但是希望找到一种更动态地执行此操作的方法,以便可以在样式表中而不是代码中实现新功能。
确保使用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