ссылка на пользовательскую функцию xsl: с помощью XPathCompiler - PullRequest
1 голос
/ 04 мая 2020

Я использую класс XPathCompiler Saxon HE в VB. NET, чтобы выполнить запросы XPath к файлу XML, а затем обработать результаты. У меня также есть XSL с пользовательскими функциями. Есть ли способ, которым я могу ссылаться на эти пользовательские функции в моих запросах XPath? Я успешно ссылаюсь на них из других XSL, но не знаю, как это сделать, когда я просто выполняю запросы XPath самостоятельно из объекта Saxon XPathCompiler.

По сути, я надеюсь, что есть какой-то способ следующий код, который я могу указать на мою таблицу стилей 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>

Ввод . xml:

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

Мне известна возможность определять функции расширения с помощью интерфейса ExtensionFunction, но я надеюсь найти способ сделать это более динамично, чтобы можно было реализовать новые функции. в таблице стилей, а не в коде.

1 Ответ

1 голос
/ 04 мая 2020

Убедитесь, что вы объявили функцию как publi c с visiblity="public", тогда вы можете использовать fn:transform (https://www.w3.org/TR/xpath-functions/#func -преобразование ) в XPath 3.1:

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

В Java API вы можете использовать http://saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/XPathCompiler.html#addXsltFunctionLibrary - net .sf.saxon.s9api.XsltPackage- для предоставления функций из пакета / таблицы стилей XSLT для XPath.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...