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

Условные утверждения в xsl

Я работаю над сайтом, который некоторые if/or statements в XSL и немного несовместимы с языком. Я не уверен, как это сделать:

если [condion one встречен] или [условие 2 выполнено], тогда выполните [действие] в противном случае [альтернативное действие]

может ли кто-нибудь предложить некоторые примеры?

Спасибо заранее!

4b9b3361

Ответ 1

Условные обозначения в 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>

где есть место для как можно большего количества <xsl:when>.

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

  • пустая строка false
  • 0 - false (так что NaN)
  • пустой node набор false
  • результатом false() является false
  • любое другое литеральное значение true (наиболее заметно: 'false' is true и '0' 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>

Написание шаблонов, соответствующих конкретным узлам, и использование <xsl:apply-templates>, чтобы заставить XSLT-процессор выбирать соответствующие, превосходит записи сложных конструкций <xsl:if> или <xsl:choose>.

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

<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, как правило, выбирают последнюю форму для своего знакомства, но целесообразно рассмотреть совпадение шаблонов вместо использования условных выражений. (также см..)

Ответ 2

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

<xsl:choose>
    <xsl:when test="[conditionOne] or [conditionTwo]">
        <!-- do [action] -->
    </xsl:when>
    <xsl:otherwise>
        <!-- do [alternative action] -->
    </xsl:otherwise>
</xsl:choose>

Ответ 3

Синтаксис общей инструкции if

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

Не уверен, что XSL имеет условие else, но вы должны быть в состоянии проверить, если true, тогда проверьте, является ли false или наоборот.

Ответ 4

В этом случае вам придется использовать 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>