วิธีการใช้คำสั่ง if-else ใน XSLT


171

ฉันพยายามใช้คำสั่ง if -else ใน XSLT แต่โค้ดของฉันไม่แยกวิเคราะห์ ไม่มีใครมีความคิดใด ๆ

  <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

หากมีการใช้คำสั่งเพื่อตรวจสอบเพียงหนึ่งเงื่อนไขอย่างรวดเร็ว เมื่อคุณมีหลายตัวเลือกให้ใช้<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>

ตัวอย่างก่อนหน้านี้จะเทียบเท่ากับ pseudocode ด้านล่าง:

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

1
คุณช่วยแก้ไขคำแถลงด้านล่างเราทุกคนรู้ว่าถ้า (กรณี> x) โดยไม่ทำตาม {} จะดำเนินการ 1 บรรทัดต่อไปนี้ฉันได้เห็นสิ่งนี้ในผู้เริ่มต้นจำนวนมากที่พวกเขาเขียนสิ่งที่คุณโพสต์ไว้ที่นี่ คัดลอก 1: 1
Oliver

1
โดยวิธีการที่if elseเงื่อนไขเป็นเพียงตัวอย่างหรือค่อนข้างรหัสเทียม ดีฉันพิจารณาข้อกังวลของคุณและฉันได้แก้ไขมัน ..
InfantPro'Aravind '

36

หากฉันอาจเสนอคำแนะนำ (สองปีต่อมา แต่หวังว่าจะเป็นประโยชน์ต่อผู้อ่านในอนาคต) :

  • แยกh2องค์ประกอบทั่วไปออก
  • แยกoooooooooooooข้อความทั่วไปออก
  • ระวังการสร้าง XPath 2.0 ใหม่if/then/elseหากใช้ XSLT 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

วิธีที่ตรงไปตรงมามากที่สุดคือการทำ if-test ที่สอง แต่มีเงื่อนไขคว่ำ เทคนิคนี้สั้นกว่าง่ายกว่าในสายตาและง่ายกว่าที่จะถูกบล็อกกว่าแบบซ้อนกันเมื่อเลือก:

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

นี่คือตัวอย่างจริงของเทคนิคที่ใช้ในแผ่นสไตล์สำหรับเว็บไซต์รัฐบาล: http://w1.weather.gov/xml/current_obs/latest_ob.xsl


5
ต้องจำและตรวจสอบให้แน่ใจว่าการifทดสอบครั้งที่สองนั้นตรงกับส่วนประกอบแรกนั้นทำให้การดัดแปลงใด ๆ ที่ตามมามีแนวโน้มที่จะเกิดข้อผิดพลาดมากขึ้น
Philippe-André Lorin

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.