2012-04-17 29 views
13

以下の2つのコードの違いは何ですか?属性がタグ内に存在するか否かの両方のコードをチェック: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> 

答えて

2

chooseを使用すると、複数の条件をテストし、場合にのみ、1試合(またはデフォルトの場合)を適用することができます。 ifでテストすることもできますが、それらは独立してテストされ、一致するそれぞれのケースに出力されます。詳細を追加する

(申し訳ありませんオフ急ぐ必要があった)

chooseを使用すると、複数のケースをテストし、唯一の条件が一致するの1、またはいくつかのデフォルトの出力を生成した場合の出力を生成することができます。例えば:

<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はまた、あなたが他のほとんどの言語で見つけること「それ以外」を持たないifテストが失敗するあなたが代替アクションを提供することを可能にすること - とシングルwhenotherwisechooseは、あなたがこの問題を回避することができますが、上記の私の例では、それは(あなたがこれをしないだろう理由を証明するために...)恐ろしいだろう選択の

<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> 
+0

詳細説明が必要です。 –

12

構造multiplを可能

<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> 

ですeチェックと、第1のテストのために実行される1つの操作は、trueと評価される。 xsl:otherwiseは、いずれのチェックもtrueと評価されていない場合にデフォルトアクションを実行するためのものです。特に、これはif-then-elseの構築を容易にします(1つだけxsl:when代替と加えてxsl:otherwiseブロック)。

それは常にxsl:ifxsl:else代替のために許可しなかったことを私に仰天が、これはxsl:choose構築物において利用可能であるように、私はそれはそれを追加していないと判断されたと思います。おそらく次のXSLTバージョンにxsl:elseが含まれていますか?

残りについては、xsl:whenxsl:ifのテストはまったく同じことを行います。条件を確認します。xsl:ifの構造が単純

<xsl:if test="a">A</xsl:if> 

単一

<xsl:when test="a">A</xsl:when> 

であることを

ノートは無効になります:xsl:when要素は常にxsl:chooseの子です。 xsl:chooseには、xsl:whenxsl:otherwiseの子供しかいません。

1

次の2つのコードの違いは何ですか?両方のコード属性がタグ内に存在するか否かをチェック :

これは真実ではない:

  1. 最初のコード・フラグメントは、その後... 場合を表し... elseアクションです。一方、2番目のフラグメントは、と表示されます。アクション。

  2. xsl:when命令内とxsl:if命令内の2つのコードフラグメントでテストされた条件が異なります。実際には、xsl:if(2番目のコード部分)のみが属性の存在をテストします。

関連する問題