Я хочу создать исключение, если один тег не содержит атрибута.
Как я могу исключить исключение из XSLT?
Ответ 1
В дополнение к правильному ответу на использование <xsl:message terminate="yes"/>
:
-
В XSLT 3.0 можно использовать новые инструкции
<xsl:try ...>
и<xsl:catch ...>
: http://www.w3.org/TR/xslt-30/#try-catch -
В XSLT 2.0 также можно использовать стандартную функцию XPath
error()
, чтобы завершить обработку.
Ниже приведен пример использования xsl:try
и xsl:catch
:
<xsl:result-document href="out.xml">
<xsl:variable name="result">
<xsl:call-template name="construct-output"/>
</xsl:variable>
<xsl:try>
<xsl:copy-of select="$result" validation="strict"/>
<xsl:catch>
<xsl:message>Warning: validation of result document failed:
Error code: <xsl:value-of select="$err:code"/>
Reason: <xsl:value-of select="$err:description"/>
</xsl:message>
<xsl:sequence select="$result"/>
</xsl:catch>
</xsl:try>
</xsl:result-document>
Ответ 2
Используйте xsl:message
с помощью terminate="yes"
, чтобы добиться эффекта, подобного бросанию исключения:
<xsl:if test="(your condition)">
<xsl:message terminate="yes">ERROR: Missing attribute XYZ under
<xsl:value-of select="local-name()"/> !</xsl:message>
</xsl:if>
Это приводит к отправке сообщения в STDERR и завершению обработки.
BTW. это сильно используется в Schematron.
Ответ 3
XSLT не предназначен для проверки! он предназначен для преобразования.. (хорошо XSLT означает преобразование языка с расширяемым стилем)
Если вы хотите проверить иерархию (это ваше требование) и проверить данные... затем перейдите на XSD! Расширяемое определение схемы.
здесь ссылка на ссылку узнать XSD
XML должен быть проверен на соответствие XSD кодом хоста (С#, Java и т.д.). Validation возвращает набор результатов. Успех или неудача с ошибками проверки (если есть)..