Саксон жалуется на неизвестную функцию, хотя функция доступна - PullRequest
0 голосов
/ 11 марта 2019

Я что-то преобразовываю с помощью xslt, пытаюсь использовать функцию xalan document-location, если и когда она доступна, и избегаю ее в противном случае (переносимо).Пример кода:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0">
  <xsl:template match="/">
    <xsl:choose>
      <xsl:when test="function-available('document-location')">
        <xsl:message>YES document-location&#xa;</xsl:message>
        <xsl:message><xsl:value-of select="document-location()"/></xsl:message>
      </xsl:when>
      <xsl:otherwise>
        <xsl:message>NO document-location&#xa;</xsl:message>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:transform>

Саксонские отчеты

SAXON 6.5.5 from Michael Kay
Java version 1.7.0_151
Error at xsl:value-of on line 8 of file:minisax.xsl:
  Error in expression document-location(): Unknown system function: document-location
Transformation failed: Failed to compile stylesheet. 1 error detected.

, хотя функция доступна для проверки перед попыткой ее использования.Кажется, он пытается использовать его до того, как «контроль» достигнет этой точки.

Он корректно работает с xalanj (ну, это легко), но также с xsltproc.

Как я могу заставить эту работу работать?

Edit / Backgroud

Это саксонская версия, поставляемая с моей оценкой Renderx XEP, которая затрудняет написание переносимых таблиц стилей для работы из коробки.Я понимаю, что это не актуальная проблема саксонского языка из-за древней версии.

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Saxon 6.5.5 - очень древний выпуск, и я бы порекомендовал вам перейти на что-то более современное.Кажется, что таблица стилей работает как положено с Saxon 9.9.

Я не собираюсь исследовать исходный код Saxon 6.5.5, но одна возможность состоит в том, что он делает предположение, что спецификация не позволяет вамдобавить функции в пространство имен функций по умолчанию (определяемое системой), и поэтому он может статически предполагать, что он знает, какие функции существуют в этом пространстве имен.Xalan явно нарушил это правило, добавив нестандартную функцию в пространство имен системы, и Саксон на это не рассчитывал.

0 голосов
/ 12 марта 2019

Я протестировал его с текущей версией xsltproc, и результат NO.Вероятно, это происходит из-за того, что в XSLT нет функции document-location().

Следовательно, я предполагаю, что вы имели в виду функцию document-uri(), которая доступна в XSLT 2.0 и более поздних версиях.

Так что если вы измените свой XSLT на

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="2.0">
  <xsl:template match="/">
    <xsl:choose>
      <xsl:when test="function-available('document-uri')">
        <xsl:message>YES document-location&#xa;</xsl:message>
        <xsl:message><xsl:value-of select="document-uri()"/></xsl:message>
      </xsl:when>
      <xsl:otherwise>
        <xsl:message>NO document-location&#xa;</xsl:message>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:transform>

вы получите положительный результат «ДА» от Saxon и путь к текущему XML-документу.

PS: Ваша саксонская версия древняя.

...