XSLTにif-elseステートメントを実装する方法は?


171

XSLTにif -elseステートメントを実装しようとしていますが、コードが解析されません。誰かアイデアはありますか?

  <xsl:variable name="CreatedDate" select="@createDate"/>
  <xsl:variable name="IDAppendedDate" select="2012-01-01" />
  <b>date: <xsl:value-of select="$CreatedDate"/></b> 

  <xsl:if test="$CreatedDate > $IDAppendedDate">
    <h2> mooooooooooooo </h2>
  </xsl:if>
  <xsl:else>
    <h2> dooooooooooooo </h2>
  </xsl:else>

回答:


316

<xsl:choose>タグを使用して再実装する必要があります:

       <xsl:choose>
         <xsl:when test="$CreatedDate > $IDAppendedDate">
           <h2> mooooooooooooo </h2>
         </xsl:when>
         <xsl:otherwise>
          <h2> dooooooooooooo </h2>
         </xsl:otherwise>
       </xsl:choose>

65

ifステートメントは、1つの条件のみをすばやくチェックするために使用されます。複数のオプションがある場合は<xsl:choose>、次の図のように使用します。

   <xsl:choose>
     <xsl:when test="$CreatedDate > $IDAppendedDate">
       <h2>mooooooooooooo</h2>
     </xsl:when>
     <xsl:otherwise>
      <h2>dooooooooooooo</h2>
     </xsl:otherwise>
   </xsl:choose>

また、以下に示すように、複数の<xsl:when>タグを使用して、If .. Else IfまたはSwitchパターンを表現できます。

   <xsl:choose>
     <xsl:when test="$CreatedDate > $IDAppendedDate">
       <h2>mooooooooooooo</h2>
     </xsl:when>
     <xsl:when test="$CreatedDate = $IDAppendedDate">
       <h2>booooooooooooo</h2>
     </xsl:when>
     <xsl:otherwise>
      <h2>dooooooooooooo</h2>
     </xsl:otherwise>
   </xsl:choose>

前の例は、以下の疑似コードと同等です。

   if ($CreatedDate > $IDAppendedDate)
   {
       output: <h2>mooooooooooooo</h2>
   }
   else if ($CreatedDate = $IDAppendedDate)
   {
       output: <h2>booooooooooooo</h2>
   }
   else
   {
       output: <h2>dooooooooooooo</h2>
   }

1
以下のステートメントを修正していただけますか?{}に従わない場合のif(case> x)は次の1行しか実行しないことを知っています。コピー1:1
オリバー

1
ちなみに、このif else状態は単なる例であり、むしろ擬似コードでした。まあ、私はあなたの懸念を考慮し、それを編集しました..
InfantPro'Aravind '

36

私がいくつかの提案をするかもしれない場合(2年後ですが、うまくいけば将来の読者に役立つでしょう)

  • 共通h2要素を取り除きます。
  • 一般的なoooooooooooooテキストを除外します。
  • if/then/elseXSLT 2.0を使用する場合は、新しいXPath 2.0 構成に注意してください。

XSLT 1.0ソリューション(XSLT 2.0でも動作します)

<h2>
  <xsl:choose>
    <xsl:when test="$CreatedDate > $IDAppendedDate">m</xsl:when>
    <xsl:otherwise>d</xsl:otherwise>
  </xsl:choose>
  ooooooooooooo
</h2>

XSLT 2.0ソリューション

<h2>
   <xsl:value-of select="if ($CreatedDate > $IDAppendedDate) then 'm' else 'd'"/>
   ooooooooooooo
</h2>

1

最も簡単な方法は、2番目のifテストを実行することですが、条件を逆にします。この方法は、ネストしたブロックを選択するよりも短く、見やすく、正しく理解するのが簡単です。

<xsl:variable name="CreatedDate" select="@createDate"/>
     <xsl:variable name="IDAppendedDate" select="2012-01-01" />
     <b>date: <xsl:value-of select="$CreatedDate"/></b> 
     <xsl:if test="$CreatedDate &gt; $IDAppendedDate">
        <h2> mooooooooooooo </h2>
     </xsl:if>
     <xsl:if test="$CreatedDate &lt;= $IDAppendedDate">
        <h2> dooooooooooooo </h2>
     </xsl:if>

以下は、政府のWebサイトのスタイルシートで使用されている手法の実際の例です。http//w1.weather.gov/xml/current_obs/latest_ob.xsl


5
2番目のifテストが最初のテストの補数と一致することを覚えて確認する必要があると、その後の変更でエラーが発生しやすくなります。
フィリップアンドレロリン2017年

2
同意する、パル。また、上記の例は読みにくいと思いますが、a <xsl:choose>を使用する方がはるかに簡単で、その意味ははるかに明確です。
Doug Barbieri

1

もともとはこのブログ投稿から。他の場合は、以下のコードを使用して達成できます

<xsl:choose>
    <xsl:when test="something to test">

    </xsl:when>
    <xsl:otherwise>

    </xsl:otherwise>
</xsl:choose>

だからここに私がやったことがあります

<h3>System</h3>
    <xsl:choose>
        <xsl:when test="autoIncludeSystem/autoincludesystem_info/@mdate"> <!-- if attribute exists-->
            <p>
                <dd><table border="1">
                    <tbody>
                        <tr>
                            <th>File Name</th>
                            <th>File Size</th>
                            <th>Date</th>
                            <th>Time</th>
                            <th>AM/PM</th>
                        </tr>
                        <xsl:for-each select="autoIncludeSystem/autoincludesystem_info">
                            <tr>
                                <td valign="top" ><xsl:value-of select="@filename"/></td>
                                <td valign="top" ><xsl:value-of select="@filesize"/></td>
                                <td valign="top" ><xsl:value-of select="@mdate"/></td>
                                <td valign="top" ><xsl:value-of select="@mtime"/></td>
                                <td valign="top" ><xsl:value-of select="@ampm"/></td>
                            </tr>
                        </xsl:for-each>
                    </tbody>
                </table>
                </dd>
            </p>
        </xsl:when>
        <xsl:otherwise> <!-- if attribute does not exists -->
            <dd><pre>
                <xsl:value-of select="autoIncludeSystem"/><br/>
            </pre></dd> <br/>
        </xsl:otherwise>
    </xsl:choose>

私の出力

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.