Как указать встроенный javascript в xsl для запуска в saxon

У меня есть преобразование xslt, которое отлично работает при запуске в Altova XML Spy, но ошибки в saxon9he.jar. Ниже приведены фрагменты кода и сообщение об ошибке saxon.

Что нужно сделать иначе, чтобы это работало при использовании saxon в качестве процессора xslt?

<xsl:stylesheet
    version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:fn="http://www.w3.org/2005/xpath-functions"
    xmlns:custom="urn:schemas-microsoft-com:xslt"
    xmlns:js="urn:custom-javascript"
    exclude-result-prefixes="custom js">

    <custom:script language="Javascript" implements-prefix="js">
        <![CDATA[
        function mergeStrings (string1, string2) {
            ... java code ...
        }
    ]]>
    </custom:script>

Пользовательский скрипт вызывается в выражениях xpath, подобных следующему:

<xsl:value-of select="js:mergeStrings(str1, str2)" disable-output-escaping="yes"/>

Я использую саксонский призыв:

java -jar C:\saxon9he.jar -s:C:\src.xml -xsl:C:\transform.xslt -o:C:\out.html

Saxon теперь выдает сообщение об ошибке, подобное следующему:

Error at xsl:value-of on line 775 column 105 of transform.xslt:
  XPST0017: XPath syntax error at char 43 on line 775 in {...gs(str1, str2...}:
    Cannot find a matching 2-argument function named {urn:custom-javascript}mergeStrings()

person Maestro13    schedule 27.01.2012    source источник


Ответы (1)


Насколько мне известно, Saxon не поддерживает написание функций расширения в Javascript. Вы можете использовать XSLT 2.0 xsl:function для написания функций с чистым XSLT и XPath 2.0, и вы можете писать функции расширения (http://www.saxonica.com/documentation/extensibility/intro.xml) на Java для Java-версии Saxon и с .NET для .NET-версии Saxon. Но я думаю, что Javascript не поддерживается.

person Martin Honnen    schedule 27.01.2012
comment
Четкий ответ - мне придется приложить дополнительные усилия, чтобы все это работало в saxon, тогда, скорее всего, используя функцию встроенных функций расширения, упомянутую на странице документации saxonica ... - person Maestro13; 27.01.2012
comment
Откровенно говоря, учитывая мощность XSLT и XPath 2.0 по сравнению с мощностью ECMAScript / Javascript, мне интересно, почему вы не можете реализовать mergeStrings с xsl:function вместо зависимости от функций расширения. Но нам нужно будет увидеть детали кода функции или, еще лучше, четкое описание требований, и все это лучше всего сделать в отдельном посте. - person Martin Honnen; 27.01.2012