Обработка пустой последовательности в функции XSLT - PullRequest
9 голосов
/ 21 августа 2009

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

"Пустая последовательность не допускается в качестве первого аргумента cda: isValidDate ()"

Любые предложения, как справиться с этой ситуацией?

1 Ответ

15 голосов
/ 21 августа 2009

В XSLT значение Null отсутствует. Чтобы представить пропущенное значение, вы можете использовать строку нулевой длины или пустую последовательность. Это не одно и то же - пустая последовательность вернет 0 из count($x), но строка нулевой длины - это последовательность, содержащая один элемент типа xs: string, длина строки которого равна 0 (count($x) = 1 и string-length($x) = 0).

Большинство стандартных функций XPath принимают либо строку нулевой длины, либо пустую последовательность, но ваша пользовательская функция может этого не делать.

Проблема может возникнуть, если вы выбираете последовательность символов. Например, если вы выберете значение узла, содержащего строку, которой узел не существует, вы получите пустую последовательность, но если узел существует и значение пустое, вы получите пустую строку.

Измените способ выбора значения, чтобы всегда иметь пустую строку (или оберните / измените функцию isValidDate, чтобы она принимала пустую последовательность). Следующее определение функции примет пустую последовательность и преобразует ее в строку нулевой длины:

<xsl:function name="cda:isValidDate" as="xs:boolean">
  <xsl:param name="datestring" as="xs:string?"/>
  <xsl:variable name="reallyastring" select="string($datestring)"/>
  Your code
</xsl:function>

? в параметре xs:string? позволяет указывать один или ни один элемент. Функция string(...) никогда не возвращает пустую строку, поэтому преобразует пустую последовательность в строку нулевой длины.

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