XSLT2 не импортирует пользовательские функции? - PullRequest
0 голосов
/ 04 января 2011

Я только что обнаружил, что если main.xsl xsl:import s lib.xsl, который определяет некоторые функции XSLT2, эти функции нельзя использовать в main.xsl.

Error: There's no function in namespace http://foo.bar/my-library-ns

Однако xsl:include импортирует эти функции.

Ответы [ 2 ]

0 голосов
/ 05 января 2011

Я только что обнаружил, что если main.xsl xsl: импортирует lib.xsl, который определяет некоторые функции XSLT2, эти функции нельзя использовать в main.xsl

Конечно, это не правда .

Взгляните на библиотеку FXSL , шаблоны которой содержат функции, которые должны быть импортированы с использованием кода XSLT. Модули таблиц стилей FXSL фактически импортируют другие модули таблиц стилей и используют их функции .

Вот простой пример:

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="http://fxsl.sf.net/"
exclude-result-prefixes="f"
>

   <xsl:import href="../f/func-foldl.xsl"/>
   <xsl:import href="../f/func-Operators.xsl"/>

<!--
    This transformation calculates 10!

        Expected result: 3628800 or 3.6288E6 
-->
    <xsl:output  encoding="UTF-8" omit-xml-declaration="yes"/>

    <xsl:template match="/">
      <xsl:value-of select="f:foldl(f:mult(), 1, 1 to 10 )"/>
    </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к любомуXML-документ (не используется), он рассчитывает 10!(10 факторных) значение:

3628800

Все три процессора XSLT 2.0, с которыми я работаю: Saxon 9, AltovaXML и XQSharp дают тот же результат.

Вот частичное представлениев иерархии импорта вышеуказанного преобразования :

alt text

Как мы видим, отображается только менее половины всего импорта ...:)

Конечно, здесь мы видим только импортированные шаблоны, но в каждом модуле импортированных таблиц стилей для каждого шаблона есть как минимум два <xsl:function> s.

0 голосов
/ 04 января 2011

Это не воспроизводится

Эта таблица стилей:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:local="http://localhost/">
    <xsl:import href="lib.xsl"/>
    <xsl:template match="/">
        <xsl:value-of select="local:function()"/>
    </xsl:template>
</xsl:stylesheet>

С этим импортированным модулем:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:local="http://localhost/"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:function name="local:function" as="xs:boolean">
        <xsl:sequence select="true()"/>
    </xsl:function>
</xsl:stylesheet>

выход *:

true

* Проверено на саксонских и альтовых. (Мой XQSharp истек ...)

...