В чем разница между атрибутами XSLT, когда и если
В чем разница между двумя приведенными ниже кодами? Оба кода проверяют, существует ли атрибут в теге или нет:
<xsl:choose>
<xsl:when test="string-length(DBE:Attribute[@name='s0SelectedSite']/node()) > 0">
<table>
...
</table>
</xsl:when>
<xsl:otherwise>
<table>
...
</table>
</xsl:otherwise>
</xsl:choose>
и
<xsl:if test="@Col1-AllocValue">
<xsl:copy-of select="@Col1-AllocValue"/>
</xsl:if>
Ответы
Ответ 1
Структура выбора
<xsl:choose>
<xsl:when test="a">A</xsl:when>
<xsl:when test="b">B</xsl:when>
<xsl:when test="c">C</xsl:when>
<xsl:when test="...">...</xsl:when>
<xsl:otherwise>Z</xsl:otherwise>
</xsl:choose>
который позволяет выполнить несколько проверок и одну операцию для первого теста, оценивающего значение true
. xsl:otherwise
предназначен для выполнения действий по умолчанию, когда ни одна из проверок не оценивает значение true
; в частности, это облегчает построение if-then-else (только одна альтернатива xsl:when
плюс блок xsl:otherwise
).
Меня всегда поразило, что xsl:if
не разрешает альтернативу xsl:else
, но поскольку это доступно в конструкции xsl:choose
, я думаю, было судимо не добавлять его. Возможно, следующая версия XSLT будет включать xsl:else
?
В остальном тесты в xsl:when
и в xsl:if
выполняются точно так же: проверьте условие.
Заметим, что структура xsl:if
просто
<xsl:if test="a">A</xsl:if>
Один
<xsl:when test="a">A</xsl:when>
будет недействительным: xsl:when
элемент всегда дочерний элемент xsl:choose
. И xsl:choose
может иметь только детей xsl:when
и xsl:otherwise
.
Ответ 2
choose
позволяет вам проверять несколько условий и применять только в том случае, если они совпадают (или случай по умолчанию). С помощью if
вы также можете проверить, но они протестированы независимо, и каждый соответствующий случай будет иметь выход.
Добавление более подробной информации (извините пришлось спешить)
choose
позволяет протестировать несколько случаев и генерировать вывод только в случае совпадения одного из условий или генерации некоторого значения по умолчанию. например:
<xsl:choose>
<xsl:when test='@foo=1'><!-- do something when @foo is 1--></xsl:when>
<xsl:when test='@foo=2'><!-- do something when @foo is 2--></xsl:when>
<xsl:when test='@foo=3'><!-- do something when @foo is 3--></xsl:when>
<xsl:otherwise><!-- this is the default case, when @foo is neither 1, 2 or 3--></xsl:otherwise>
</xsl:choose>
Как вы видите, один из "ветвей" будет принят в зависимости от значения @foo
.
С if
он представляет собой один тест и генерирует результат по результатам этого теста:
<xsl:if test='@foo=1'><!-- do this if @foo is 1--></xsl:if>
<xsl:if test='@foo=2'><!-- do this if @foo is 2--></xsl:if>
<xsl:if test='@foo=3'><!-- do this if @foo is 3--></xsl:if>
Усложнение здесь - это случай сбоя - что происходит, когда @foo
не равно 1,2 или 3? Этот недостающий случай - это то, что аккуратно обрабатывается choose
- то есть возможностью иметь действие по умолчанию.
XSL также не имеет "else", который вы найдете на большинстве других языков, что позволяет вам предлагать альтернативное действие, если тест if
fail - и choose
с одним when
и otherwise
позволяет вам обойти это, но в моем примере выше это было бы ужасно (чтобы продемонстрировать, почему вы этого не сделаете..)
<xsl:choose>
<xsl:when test='@foo=1'><!-- do something when @foo is 1--></xsl:when>
<xsl:otherwise> <!-- else -->
<xsl:choose>
<xsl:when test='@foo=2'><!-- do something when @foo is 2--></xsl:when>
<xsl:otherwise> <!-- else -->
<xsl:choose>
<xsl:when test='@foo=2'><!-- do something when @foo is 2--></xsl:when>
<xsl:otherwise><!-- this is the case, when @foo is neither 1, 2 or 3--></xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
Ответ 3
В чем разница между двумя приведенными ниже кодами? Оба кода проверяет, существует ли атрибут в теге или нет:
Это неверно:
-
Первый фрагмент кода выражает действие if... then... else, а второй фрагмент выражает только действие if....
-
Условия, проверенные на наличие двух кодовых фрагментов - в инструкции xsl:when
и внутри инструкций xsl:if
, различны. Фактически только xsl:if
(во втором фрагменте кода) проверяет наличие атрибута.