XSLT'de if-else deyimi nasıl uygulanır?


171

XSLT bir if -else deyimi uygulamak çalışıyorum ama kodum sadece ayrıştırmıyor. Herhangi bir fikri olan var mı?

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

Yanıtlar:


316

<xsl:choose>Etiketi kullanarak yeniden uygulamanız gerekir :

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

65

İfade, yalnızca bir koşulu hızlı bir şekilde kontrol etmek için kullanılırsa. Birden fazla seçeneğiniz olduğunda, <xsl:choose>aşağıda gösterildiği gibi kullanın :

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

Ayrıca, aşağıda gösterildiği gibi <xsl:when>ifade If .. Else Ifveya Switchkalıpları ifade etmek için birden fazla etiket kullanabilirsiniz :

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

Önceki örnek, aşağıdaki sahte kodla eşdeğerdir:

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

1
Aşağıdaki ifadeyi düzeltebilir misiniz, hepimiz biliyoruz ki {} takip etmeden (case> x) sadece 1 satır takip edecekse, bunu birçok yeni başlayana tam olarak burada yayınladıklarınızı yazdıklarını gördüm, muhtemelen birçoğu kopyalandı 1: 1
Oliver

1
Bu arada, if elsedurum sadece bir örnek veya Aksine bir sahte koddu. Endişenizi düşünüyorum ve düzenledim ..
InfantPro'Aravind '

36

Bazı öneriler sunabilirsem (iki yıl sonra gelecekteki okuyucular için faydalı olabilir) :

  • Ortak h2unsuru hesaba katın.
  • Ortak ooooooooooooometni hesaba katın.
  • if/then/elseXSLT 2.0 kullanıyorsanız yeni XPath 2.0 yapısına dikkat edin.

XSLT 1.0 Çözümü (XSLT 2.0 ile de çalışır)

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

XSLT 2.0 Çözümü

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

1

En basit yaklaşım ikinci bir if-testi yapmaktır, ancak durum ters çevrilmiş haldedir. Bu teknik, daha kısa, gözlerde daha kolay ve doğru bir şekilde iç içe yerleştirilen bir bloktan daha doğru bir şekilde elde edilmesi daha kolaydır:

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

Bir hükümet web sitesi için stil sayfasında kullanılan tekniğin gerçek dünya örneği: http://w1.weather.gov/xml/current_obs/latest_ob.xsl


5
İkinci iftestin birincinin tamamlayıcısıyla eşleştiğini hatırlamak ve emin olmak, sonraki değişiklikleri hataya daha açık hale getirir.
Philippe-André Lorin

2
Katılıyorum, Pal. Ayrıca, yukarıdaki örneğin okunmasının daha zor olduğunu düşünüyorum, ancak a'nın <xsl:choose>kullanımı çok daha basit olurdu, anlamı daha açıktır.
Doug Barbieri

1

Aslen bu blog yazısından . Aşağıdaki kodu kullanarak başka bir sonuca ulaşabiliriz

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

    </xsl:when>
    <xsl:otherwise>

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

İşte yaptığım şey

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

Çıktı

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.