Подтвердить что ты не робот

В чем разница между атрибутами XSLT, когда и если

В чем разница между двумя приведенными ниже кодами? Оба кода проверяют, существует ли атрибут в теге или нет:

<xsl:choose>
  <xsl:when test="string-length(DBE:Attribute[@name='s0SelectedSite']/node()) &gt; 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>
4b9b3361

Ответ 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 (во втором фрагменте кода) проверяет наличие атрибута.