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 문은 하나의 조건 만 빠르게 확인하는 데 사용됩니다. 여러 옵션이있는 경우 <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
Oliver

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

가장 간단한 접근 방식은 두 번째 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
동의합니다, Pal. 또한 위의 예제는 읽기가 더 어렵다고 생각하지만 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.