xslt: функция с двумя аргументами не распознана - PullRequest
0 голосов
/ 23 сентября 2018

В следующем фрагменте XSLT

<?xml version="1.0" ?>
<xsl:stylesheet version="2.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:my="bla">

    <xsl:template match="/">
       <xsl:value-of select="my:add(4,2)"/>
    </xsl:template>

    <xsl:function name="my:add" as="xs:integer">
        <xs:param name="n" as="xs:integer"/>
        <xs:param name="k" as="xs:integer"/>
        <xsl:value-of select="$n + $k"/>
    </xsl:function>

</xsl:stylesheet>

я получаю следующие ошибки:

Static error in {my:add(4,2)} in expression in xsl:value-of/@select on line 9 column 40 of john.xsl:
  XPST0017: Cannot find a 2-argument function named {bla}add(). The namespace URI and local
  name are recognized, but the number of arguments is wrong
Static error at char 3 in xsl:value-of/@select on line 30 column 37 of john.xsl:
  XPST0008: Variable n has not been declared (or its declaration is not in scope)
Errors were reported during stylesheet compilation

Я знаю, что могу использовать <xsl:function name="my:add" as="xs:integer*"> в качестве функциональной головки, но я не хочутак и есть.Я не могу выяснить, что не так с этим, потому что я нашел несколько похожих примеров, подобных этому.

1 Ответ

0 голосов
/ 23 сентября 2018

Параметры функции находятся в пространстве имен схемы.Они должны быть в пространстве имен XSLT.

Без xsl:param, это функция нулевой арности, которая содержит два элемента param, которые находятся в пространстве имен схемы.

[Определение: The arity функции таблицы стилей - это количество элементов xsl: param в определении функции.] Дополнительные аргументы недопустимы.

Измените префикс пространства имен с xs на xsl на param элементах: xsl:param.

Кроме того, поскольку ваша функция возвращает целое число, используйте xsl:sequence вместо xsl:value-of.xsl:value-of выдаст строку из числового результата, которую затем нужно будет привести к xs:integer.Просто верните числовой продукт как есть.

<?xml version="1.0" ?>
<xsl:stylesheet version="2.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:my="bla">

    <xsl:template match="/">
       <xsl:value-of select="my:add(4,2)"/>
    </xsl:template>

    <xsl:function name="my:add" as="xs:integer">
        <xsl:param name="n" as="xs:integer"/>
        <xsl:param name="k" as="xs:integer"/>
        <xsl:sequence select="$n + $k"/>
    </xsl:function>

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