Условные операторы в xsl - PullRequest
20 голосов
/ 21 июля 2009

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

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

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

Заранее спасибо!

Ответы [ 4 ]

41 голосов
/ 21 июля 2009

Условные выражения в XSLT являются одинарными "если":

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

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

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

3 голосов
/ 21 июля 2009

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>
1 голос
/ 21 июля 2009

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

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

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

0 голосов
/ 21 июля 2009

В этом случае вам придется использовать 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...