Bagaimana menerapkan pernyataan if-else di XSLT?

171

Saya mencoba menerapkan pernyataan if -else di XSLT tetapi kode saya tidak diuraikan. Adakah yang punya ide?

  <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>
Funky
sumber
Kemungkinan rangkap XSL jika kondisi lain

Jawaban:

316

Anda harus menerapkannya kembali menggunakan <xsl:choose>tag:

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

Jika pernyataan digunakan untuk memeriksa satu syarat dengan cepat. Ketika Anda memiliki beberapa opsi, gunakan <xsl:choose>seperti yang diilustrasikan di bawah ini:

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

Anda juga dapat menggunakan beberapa <xsl:when>tag untuk mengekspresikan If .. Else Ifatau Switchpola seperti yang diilustrasikan di bawah ini:

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

Contoh sebelumnya akan setara dengan pseudocode di bawah ini:

   if ($CreatedDate > $IDAppendedDate)
   {
       output: <h2>mooooooooooooo</h2>
   }
   else if ($CreatedDate = $IDAppendedDate)
   {
       output: <h2>booooooooooooo</h2>
   }
   else
   {
       output: <h2>dooooooooooooo</h2>
   }
InfantPro'Aravind '
sumber
1
Bisakah Anda memperbaiki pernyataan di bawah ini, kita semua tahu bahwa jika (huruf> x) tanpa mengikuti {} hanya akan mengeksekusi 1 baris berikut, saya telah melihat ini pada banyak pemula bahwa mereka menulis persis apa yang telah Anda posting di sini, mungkin banyak dari mereka disalin 1: 1
Oliver
1
Ngomong-ngomong, if elsekondisinya hanyalah contoh atau Agak pseudocode. Yah, saya mempertimbangkan keprihatinan Anda dan saya sudah mengeditnya ..
InfantPro'Aravind '
36

Jika saya dapat menawarkan beberapa saran (dua tahun kemudian tetapi semoga bermanfaat bagi pembaca di masa mendatang) :

  • Faktor faktor umum h2.
  • Faktor di luar oooooooooooooteks umum .
  • Waspadai if/then/elsekonstruk XPath 2.0 baru jika menggunakan XSLT 2.0.

Solusi XSLT 1.0 (juga berfungsi dengan XSLT 2.0)

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

Solusi XSLT 2.0

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

Pendekatan yang paling lurus ke depan adalah melakukan uji-coba kedua tetapi dengan kondisi terbalik. Teknik ini lebih pendek, lebih mudah pada mata, dan lebih mudah untuk mendapatkan yang benar dari pada blok pilihan-kapan-jika tidak:

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

Berikut adalah contoh nyata dari teknik yang digunakan dalam style-sheet untuk situs web pemerintah: http://w1.weather.gov/xml/current_obs/latest_ob.xsl

Raymond Hettinger
sumber
5
Harus mengingat dan memastikan bahwa iftes kedua cocok dengan yang pertama membuat modifikasi berikutnya lebih rentan terhadap kesalahan.
Philippe-André Lorin
2
Saya setuju, Pal. Juga, saya pikir contoh di atas lebih sulit dibaca, sedangkan menggunakan a <xsl:choose>akan jauh lebih mudah, artinya jauh lebih jelas.
Doug Barbieri
1

Berasal dari posting blog ini . Kita bisa meraihnya dengan menggunakan kode di bawah ini

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

    </xsl:when>
    <xsl:otherwise>

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

Jadi inilah yang saya lakukan

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

Keluaran saya

masukkan deskripsi gambar di sini

AabinGunz
sumber