Выброс исключения из XSLT

Мне нужен XSLT для остановки обработки с ошибкой, когда внешний документ недоступен. Из того, что я выяснил, кажется, что тег ‹xsl: message› является правильным способом сделать это, но пока он не работает. Вот что я пробовал:

<xsl:if test="not(document('some_external_doc.xml')//myxpath)">
    <xsl:message terminate="yes">ERROR: Missing element!</xsl:message>
    <h1>Error detected!</h1>
</xsl:if>

Отсутствующий документ / xpath обнаруживается ‹xsl: if› и ‹h1› будет отображаться, но по какой-то причине атрибут terminate сообщения ‹xsl: message› игнорируется. Преобразование выполняется в Railo, поэтому процессор XSLT должен использоваться по умолчанию в Java, но мне не удалось найти что-то определенное о процессоре, который использует Railo.


person korguell    schedule 03.09.2014    source источник
comment
Почему бы не проверить схему перед преобразованием? XSD был создан не случайно.   -  person Matthew Whited    schedule 03.09.2014
comment
Вы можете использовать функцию system-property в XML, чтобы получить свойства xsl:version, xsl:vendor, xsl:vendor-url - это точно скажет вам, какой XSLT-процессор вы используете.   -  person Flynn1179    schedule 05.09.2014


Ответы (1)


Однако у вас есть правильное представление ...

Если ваш процессор XSLT реализует XSLT 1.0, он технически не должен завершать работу. Обратите внимание на использование слова следует, а не обязательно в спецификации для xsl:message:

Если атрибут terminate имеет значение yes, то процессор XSLT должен прекратить обработку после отправки сообщения. Значение по умолчанию - нет.

Интересно, что XSLT 2.0 изменяет должен должен:

Если действующее значение атрибута terminate - yes, то процессор должен прекратить обработку после отправки сообщения.

Также обратите внимание, что порядок выполнения операторов xsl:message зависит от процессора; помните об этом при поиске xsl:message вывода в журналах.

Наконец, у вас есть дополнительные параметры обработки исключений в XSLT 2.0 (error () функция) и XSLT 3.0 (xsl: try и xsl: catch).

person kjhughes    schedule 03.09.2014
comment
Честно говоря, я думаю, что изменение формулировок между 1.0 и 2.0 было больше для разъяснения, чем для изменения смысла. Я прочитал это определение 1.0 как означающее, что если процессор не завершит работу, это будет нарушением спецификации. - person Flynn1179; 05.09.2014