Условные операторы в xsl

Как правило, каждый следует соглашениям, используемым в стандартной библиотеке языка.

20
задан toomanyairmiles 21 July 2009 в 15:13
поделиться

4 ответа

Условные выражения в XSLT представляют собой либо унарное «if»:

<xsl:if test="some Boolean condition">
  <!-- "if" stuff (there is no "else" here) -->
</xsl:if>

, либо более похожее на оператор switch в других языках:

<xsl:choose>
  <xsl:when test="some Boolean condition">
    <!-- "if" stuff -->
  </xsl:when>
  <xsl:otherwise>
    <!-- "else" stuff -->
  </xsl:otherwise>
</xsl:choose>

, где есть место для такого же количества s, как вам нравится.

Каждое выражение XPath может быть вычислено как логическое в соответствии с набором правил . Они (по большей части) сводятся к "если есть что-то -> истина " / "если ничего нет -> ложь "

  • пустая строка ] false
  • 0 - false (как и NaN )
  • пустой набор узлов - false
  • результат false () равно ложь
  • , любое другое буквальное значение равно истина (особенно: 'ложь' истинно и '0' равно истинно )
  • результат выражений оценивается по указанным правилам (здесь нет ничего удивительного)

Изменить: есть, конечно, более продвинутый (и более идиоматический) метод управления потоком программы, и это сопоставление с шаблоном:

<xsl:template match="node[contains(., 'some text')]">
  <!-- output X -->
</xsl:template>

<xsl:template match="node[not(contains(., 'some text'))]">
  <!-- output Y -->
</xsl:template>

<xsl:template match="/">
  <xsl:apply-templates select=".//node" />
</xsl:template>

Написание шаблонов, которые соответствуют определенным узлам и использование для заставить XSLT-процессор выбирать подходящие лучше, чем писать сложные конструкции или .

Приведенный выше пример эквивалентен императивному стилю:

<xsl:template match="/">
  <xsl:for-each select=".//node">
    <xsl:choose>
      <xsl:when test="contains(., 'some text')">
        <!-- output X -->
      </xsl:when>
      <xsl:when test="not(contains(., 'some text'))">
        <!-- output Y -->
      </xsl:when>
    <xsl:choose>
  <xsl:for-each>
</xsl:template>

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

is true )
  • результат выражений оценивается по указанным правилам (здесь нет ничего удивительного)

  • Редактировать: Конечно, существует более продвинутый (и более идиоматический) метод управления программой поток, и это сопоставление шаблонов:

    <xsl:template match="node[contains(., 'some text')]">
      <!-- output X -->
    </xsl:template>
    
    <xsl:template match="node[not(contains(., 'some text'))]">
      <!-- output Y -->
    </xsl:template>
    
    <xsl:template match="/">
      <xsl:apply-templates select=".//node" />
    </xsl:template>
    

    Написание шаблонов, которые соответствуют определенным узлам, и использование , чтобы процессор XSLT выбирал подходящие, лучше, чем писать сложные или конструкции.

    Приведенный выше пример эквивалентен императивному стилю:

    <xsl:template match="/">
      <xsl:for-each select=".//node">
        <xsl:choose>
          <xsl:when test="contains(., 'some text')">
            <!-- output X -->
          </xsl:when>
          <xsl:when test="not(contains(., 'some text'))">
            <!-- output Y -->
          </xsl:when>
        <xsl:choose>
      <xsl:for-each>
    </xsl:template>
    

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

    is true )
  • результат выражений оценивается по указанным правилам (здесь нет ничего удивительного)

  • Редактировать: Конечно, есть более продвинутый (и более идиоматический) метод управления программой поток, и это сопоставление шаблонов:

    <xsl:template match="node[contains(., 'some text')]">
      <!-- output X -->
    </xsl:template>
    
    <xsl:template match="node[not(contains(., 'some text'))]">
      <!-- output Y -->
    </xsl:template>
    
    <xsl:template match="/">
      <xsl:apply-templates select=".//node" />
    </xsl:template>
    

    Написание шаблонов, которые соответствуют определенным узлам, и использование , чтобы процессор XSLT выбирал подходящие, лучше, чем писать сложные или конструкции.

    Приведенный выше пример эквивалентен императивному стилю:

    <xsl:template match="/">
      <xsl:for-each select=".//node">
        <xsl:choose>
          <xsl:when test="contains(., 'some text')">
            <!-- output X -->
          </xsl:when>
          <xsl:when test="not(contains(., 'some text'))">
            <!-- output Y -->
          </xsl:when>
        <xsl:choose>
      <xsl:for-each>
    </xsl:template>
    

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

    Конечно, существует более продвинутый (и более идиоматический) метод управления потоком программы, и это сопоставление шаблонов:

    <xsl:template match="node[contains(., 'some text')]">
      <!-- output X -->
    </xsl:template>
    
    <xsl:template match="node[not(contains(., 'some text'))]">
      <!-- output Y -->
    </xsl:template>
    
    <xsl:template match="/">
      <xsl:apply-templates select=".//node" />
    </xsl:template>
    

    Написание шаблонов, соответствующих определенным узлам, и использование для создания XSLT-процессор выбирает подходящие, лучше, чем писать сложные конструкции или .

    Приведенный выше пример эквивалентен императивному стилю:

    <xsl:template match="/">
      <xsl:for-each select=".//node">
        <xsl:choose>
          <xsl:when test="contains(., 'some text')">
            <!-- output X -->
          </xsl:when>
          <xsl:when test="not(contains(., 'some text'))">
            <!-- output Y -->
          </xsl:when>
        <xsl:choose>
      <xsl:for-each>
    </xsl:template>
    

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

    Конечно, существует более продвинутый (и более идиоматический) метод управления потоком программы, и это сопоставление шаблонов:

    <xsl:template match="node[contains(., 'some text')]">
      <!-- output X -->
    </xsl:template>
    
    <xsl:template match="node[not(contains(., 'some text'))]">
      <!-- output Y -->
    </xsl:template>
    
    <xsl:template match="/">
      <xsl:apply-templates select=".//node" />
    </xsl:template>
    

    Написание шаблонов, соответствующих определенным узлам, и использование для создания XSLT-процессор выбирает подходящие, лучше, чем писать сложные конструкции или .

    Приведенный выше пример эквивалентен императивному стилю:

    <xsl:template match="/">
      <xsl:for-each select=".//node">
        <xsl:choose>
          <xsl:when test="contains(., 'some text')">
            <!-- output X -->
          </xsl:when>
          <xsl:when test="not(contains(., 'some text'))">
            <!-- output Y -->
          </xsl:when>
        <xsl:choose>
      <xsl:for-each>
    </xsl:template>
    

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

    , чтобы заставить XSLT-процессор выбирать подходящие, лучше, чем писать сложные конструкции или .

    Приведенный выше пример эквивалентен императивному стилю:

    <xsl:template match="/">
      <xsl:for-each select=".//node">
        <xsl:choose>
          <xsl:when test="contains(., 'some text')">
            <!-- output X -->
          </xsl:when>
          <xsl:when test="not(contains(., 'some text'))">
            <!-- output Y -->
          </xsl:when>
        <xsl:choose>
      <xsl:for-each>
    </xsl:template>
    

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

    , чтобы заставить XSLT-процессор выбирать подходящие, лучше, чем писать сложные конструкции или .

    Приведенный выше пример эквивалентен императивному стилю:

    <xsl:template match="/">
      <xsl:for-each select=".//node">
        <xsl:choose>
          <xsl:when test="contains(., 'some text')">
            <!-- output X -->
          </xsl:when>
          <xsl:when test="not(contains(., 'some text'))">
            <!-- output Y -->
          </xsl:when>
        <xsl:choose>
      <xsl:for-each>
    </xsl:template>
    

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

    41
    ответ дан 29 November 2019 в 23:33
    поделиться

    XSL имеет , но вы, вероятно, больше ищете / < xsl: when> / последовательность. Некоторые примеры здесь (внизу). Возможно:

    <xsl:choose>
        <xsl:when test="[conditionOne] or [conditionTwo]">
            <!-- do [action] -->
        </xsl:when>
        <xsl:otherwise>
            <!-- do [alternative action] -->
        </xsl:otherwise>
    </xsl:choose>
    
    3
    ответ дан 29 November 2019 в 23:33
    поделиться

    В этом случае вам нужно будет использовать xsl: choose . Это похоже на использование if / else с заключительным словом else.

    <xsl:choose>
      <xsl:when test="condition one or condition two">
        <!-- action -->
      </xsl:when>
      <xsl:otherwise>
        <!-- alternative action -->
      </xsl:otherwise>
    </xsl:choose>
    
    0
    ответ дан 29 November 2019 в 23:33
    поделиться

    Общий синтаксис оператора if -

    <xsl:if test="expression">
      ...some output if the expression is true...
    </xsl:if>
    

    Не уверен, есть ли в XSL условие else, но вы должны иметь возможность проверить, истинно ли оно, а затем проверить, если ложно, или наоборот.

    1
    ответ дан 29 November 2019 в 23:33
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: