web-dev-qa-db-ja.com

XSLの条件ステートメント

XSLのif/orステートメントがいくつかあり、言語に少し不慣れなサイトで作業していますが、どのように実行すればよいかわかりません。

[条件1が満たされている]または[条件2が満たされている]場合は[ア​​クション]を実行します。それ以外の場合は[代替アクション]を実行します

誰かがいくつかの例を提供できますか?

前もって感謝します!

20
toomanyairmiles

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>_ sの余地があります。

すべての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の初心者は使いやすさから後者の形式を選択する傾向がありますが、条件文を使用する代わりにテンプレートマッチングを調べることは価値があります。 (また 参照 。)

41
Tomalak

XSLには<xsl:if>、しかしあなたはおそらく<xsl:choose>/<xsl:when>/<xsl:otherwise>シーケンス。いくつかの例 here (下部近く)。多分:

<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かどうか、またはその逆をテストできるはずです。

1
Flyer1

この場合、xsl:chooseを使用する必要があります。これは、if/elseとfinal elseを使用するようなものです。

<xsl:choose>
  <xsl:when test="condition one or condition two">
    <!-- action -->
  </xsl:when>
  <xsl:otherwise>
    <!-- alternative action -->
  </xsl:otherwise>
</xsl:choose>
0
Zack The Human