Làm cách nào để triển khai câu lệnh if-other trong XSLT?


171

Tôi đang cố gắng thực hiện một câu lệnh if -else trong XSLT nhưng mã của tôi không phân tích cú pháp. Có ai có ý tưởng nào?

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

Bản sao XSL

Câu trả lời:


316

Bạn phải thực hiện lại bằng <xsl:choose>thẻ:

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

65

Nếu câu lệnh được sử dụng để kiểm tra chỉ một điều kiện một cách nhanh chóng. Khi bạn có nhiều tùy chọn, hãy sử dụng <xsl:choose>như minh họa bên dưới:

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

Ngoài ra, bạn có thể sử dụng nhiều <xsl:when>thẻ để thể hiện If .. Else Ifhoặc Switchcác mẫu như minh họa bên dưới:

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

Ví dụ trước sẽ tương đương với mã giả bên dưới:

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

1
Bạn có thể vui lòng sửa câu lệnh bên dưới không, tất cả chúng ta đều biết rằng nếu (trường hợp> x) mà không theo dõi {} sẽ chỉ thực hiện 1 dòng sau, tôi đã thấy điều này trên nhiều người mới bắt đầu rằng họ viết chính xác những gì bạn đã đăng ở đây, có lẽ nhiều người trong số họ sao chép 1: 1
Oliver

1
Nhân tiện, if elseđiều kiện chỉ là một ví dụ hoặc Thay vào đó là một mã giả. Chà, tôi xem xét mối quan tâm của bạn và tôi đã chỉnh sửa nó ..
InfantPro'Aravind '

36

Nếu tôi có thể đưa ra một số gợi ý (hai năm sau nhưng hy vọng sẽ hữu ích cho độc giả tương lai) :

  • Yếu tố ra h2yếu tố chung .
  • Yếu tố ra ooooooooooooovăn bản chung .
  • Lưu ý về if/then/elsecấu trúc XPath 2.0 mới nếu sử dụng XSLT 2.0.

Giải pháp XSLT 1.0 (cũng hoạt động với XSLT 2.0)

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

Giải pháp XSLT 2.0

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

1

Cách tiếp cận đơn giản nhất là thực hiện một bài kiểm tra if thứ hai nhưng với điều kiện đảo ngược. Kỹ thuật này ngắn hơn, dễ nhìn hơn và dễ lấy hơn so với khối được chọn khi khác.

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

Đây là một ví dụ thực tế về kỹ thuật đang được sử dụng trong biểu định kiểu cho trang web của chính phủ: http://w1.weather.gov/xml/cien_obs/latest_ob.xsl


5
Phải nhớ và đảm bảo rằng ifthử nghiệm thứ hai phù hợp với bổ sung của thử nghiệm đầu tiên làm cho bất kỳ sửa đổi tiếp theo nào dễ bị lỗi hơn.
Philippe-André Lorin

2
Tôi đồng ý, Pal. Ngoài ra, tôi nghĩ rằng ví dụ trên khó đọc hơn, trong khi sử dụng một từ <xsl:choose>sẽ đơn giản hơn nhiều, ý nghĩa của nó rõ ràng hơn nhiều.
Doug Barbieri

1

Ban đầu từ bài viết trên blog này . Chúng ta có thể đạt được nếu khác bằng cách sử dụng mã dưới đây

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

    </xsl:when>
    <xsl:otherwise>

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

Vì vậy, đây là những gì tôi đã làm

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

Đầu ra của tôi

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.