XSLT 2.0 выдает ошибку: элемент контекста не определен

Мы используем Altova Stylevision, который создает файлы XSLT 2.0. Мы используем Saxon 9 для Java для выполнения этих файлов XSLT. Это хорошо работает уже несколько лет, но, увы, никто из нас на самом деле не понимает XSLT.

Теперь имеем ошибку:

Error at /xsl:stylesheet/xsl:function[9]
XPDY0002: Axis step child::element(item, xs:anyType) cannot be used here:
  the context item is undefined

9-я функция:

<xsl:function name="sps:GoogleChartDataSourceUnitCount" as="xs:string">
  <xsl:sequence select="concat(string-join(item/string(if ( number($XML/report/calculation-data[@data-source-name = $DataSourceParent]/item/variable[@name=&apos;unit_count&apos;]/@value) &lt; 0 ) then 0 else round-half-to-even(number(variable[@name=&apos;unit_count&apos;]/@value),2)),&apos;,&apos;),&apos;&amp;chxl=0:|&apos;,string-join(item/variable[@name=&apos;month&apos;]/@value,&apos;|&apos;),&apos;|2:||Min&amp;chds=0,&apos;,string(round-half-to-even( max(item/(number(variable[@name=&apos;unit_count&apos;]/@value)))+1 , 0 )),&apos;&amp;chxr=1,0,&apos;,string(round-half-to-even( max(item/(number(variable[@name=&apos;unit_count&apos;]/@value)))+1 , 0 )))"/>
</xsl:function>

Кто-нибудь знает, что происходит?


person Adrian Smith    schedule 10.04.2012    source источник


Ответы (3)


Проблема в том, что функция использует выражения пути, такие как item, которые нуждаются в элементе контекста, как предписывает спецификация " В теле функции таблицы стилей фокус изначально не определен; это означает, что любая попытка сослаться на элемент контекста, позицию контекста или размер контекста является неисправимой динамической ошибкой. [XPDY0002]". Таким образом, функция должна иметь параметр, который передается в узле или последовательности узлов, к которым следует применить путь, например.

<xsl:function name="sps:GoogleChartDataSourceUnitCount" as="xs:string">
  <xsl:param name="nodes"/>
  <xsl:sequence select="concat(string-join($nodes/item/string(...)))"/>
</xsl:function>

а затем его нужно вызвать, например. sps:GoogleChartDataSourceUnitCount(.).

Если таблица стилей создается каким-либо инструментом Altova, вы можете узнать на форумах Altova, известно ли это проблема и доступно ли исправление.

person Martin Honnen    schedule 10.04.2012

Согласно спецификации W3C XSLT 2.0, начальный элемент контекста для xsl:function не определен< /сильный>.

Это означает, что внутри тела функции любая ссылка на данные (элементы) может происходить только с параметрами (переданными или глобальными) или переменными.

Проблема в том, что выражение в предоставленном коде начинается с:

concat(string-join(item ...

и это явно нарушает приведенное выше правило - item ссылается на элемент контекста, что не разрешено внутри xsl:function.

Решение:

  1. Передайте предполагаемый элемент контекста в качестве параметра (рекомендуется), скажем, с именем pDoc, или сделайте так, чтобы глобальная переменная/параметр содержала предполагаемый элемент контекста.

  2. Ссылочные элементы в первом шаге расположения выражения XPath вне этого параметра/переменной, например $pDoc/item

Часто задаваемые вопросы: почему это ограничение?

Ответ. Запрет неявного начального элемента контекста позволяет процессору XSLT выполнять более обширный статический анализ и гораздо более агрессивно оптимизировать код.

person Dimitre Novatchev    schedule 10.04.2012

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

person Cocu_1012    schedule 15.01.2013