18

以下の 2 つのコードの違いは何ですか? どちらのコードも、タグに属性が存在するかどうかを確認します。

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

3 に答える 3

17

choose の構造は

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

これにより、 に評価される最初のテストに対して、複数のチェックと 1 つの操作を実行できますtruexsl:otherwiseどのチェックも に評価されない場合にデフォルト アクションを実行するためのものtrueです。特に、これは if-then-else 構造 (ただ 1 つのxsl:when選択肢とxsl:otherwiseブロック) を容易にします。

xsl:if代替案が認められなかったのにはいつも驚かされましたxsl:elseが、これはxsl:chooseコンストラクトで利用できるので、追加しないと判断されたのでしょう。おそらく、次の XSLT バージョンには ? が組み込まれるxsl:elseでしょう。

xsl:when残りの部分については、とのテストxsl:ifはまったく同じことを行います: 条件をチェックします。

xsl:ifの構造は単純であることに注意してください。

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

独身者

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

は無効です:xsl:when要素は常にの子ですxsl:choose。そしてxsl:choose、子供xsl:whenを持つことができxsl:otherwiseます。

于 2012-04-17T10:39:18.260 に答える
3

を使用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>

ご覧のとおり、 の値に応じて「分岐」の1 つ@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>

ここで複雑なのは、失敗の場合です。1、2、3 のいずれでもない場合はどうなる@fooでしょうか。この欠落しているケースは、 によって適切に処理されます。つまり、デフォルトアクションchooseを持つ機能です。

XSL には、他のほとんどの言語に見られる "else" もありません。これにより、ifテストが失敗しchooseた場合に代替アクションwhenを提供otherwiseできます。恐ろしい(なぜこれをしないのかを示すために..)

<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>
于 2012-04-17T10:23:14.343 に答える
1

以下の 2 つのコードの違いは何ですか? どちらのコードも、タグに属性が存在するかどうかを確認します。

これは正しくありません:

  1. 最初のコード フラグメントはif ... then ... elseアクションを表し、2 番目のコード フラグメントはif ...アクションのみを表します。

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

于 2012-04-17T13:28:58.563 に答える