2009-03-15 4 views
1

Если вы используете функцию документа и открываете файлы, которые могут не существовать, например.xslt document function question

<xsl:variable name="input" select="document($A)/document/input"/> 

Что такое изящный способ обработки ошибки? Я хотел бы значение по умолчанию для переменной, если файл не может быть открыт.

ответ

1

Я считаю, что вы можете написать <xsl:variable> так:

<xsl:variable name="input"> 
<xsl:choose> 
    <xsl:when test="document($A)/document/testElementCondition = 'foo'"> 
    <xsl:value-of select="document($A)/document/input" /> 
    </xsl:when> 
    <xsl:otherwise> 
    <!-- add some default source document and logic that will then direct to an error message. --> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

Это очень плохо, что вам часто приходится приводить к хаков, чтобы получить вещи сделано в XSL.

+1

Как указывалось в моем ответе, нет гарантии, что XSLT-процессор не будет вызывать ошибку (что разрешено спецификацией XSLT). Следовательно, вышеизложенное не является полностью правильным ответом. –

0

Изящный способ заключается в проверке существования файла перед отправкой параметра в таблицу стилей.

+0

На самом деле это не из командной строки, я просто написал вопрос, чтобы сделать это простым. (Я согласен с вашим комментарием, если это было.) :-) Кажется, что они должны быть каким-то образом «обрабатывать ошибки», например, с помощью xslt. – Atlas1j

7

Существует не общий способ обработки изящно ошибки в функции.

Согласно XSLT 1.0 spec:

"Если есть ошибка при получении ресурса, то процессор XSLT может сигнализировать об ошибке, если он не сигнализирует об ошибке, он должен восстановить, вернув пустой множество узлов. "

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

В случае, если мы проверили, что конкретная реализация конкретного XSLT-процессора производит только пустой набор узлов и не завершает преобразование, мы можем решить протестировать это условие и «изящно» восстановить. Однако наше приложение становится не переносным, это зависит от этого конкретного XSLT-процессора, и нет абсолютно никакой гарантии, что в следующей версии это поведение не изменится к худшему. Рискованный, не так ли?

Таким образом, лучше всего, чтобы тот, кто запускает преобразование (например, из программы C#), должен проверить наличие файла и передать соответствующий параметр преобразованию, отражающий это существование.