Як реалізувати оператор if-else в XSLT?


171

Я намагаюся реалізувати оператор if -se в 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>

Можливий дублікат XSL, якщо інша умова

Відповіді:


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>

Попередній приклад був би еквівалентний псевдокоду нижче:

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

1
Чи можете ви виправити наведене нижче твердження, ми всі знаємо, що якщо (випадок> х) без наступного {} виконає лише 1 наступний рядок, я це бачив у багатьох початківців, що вони пишуть саме те, що ви розмістили тут, напевно, багато з них скопійовано 1: 1
Олівер

1
До речі, if elseумова була лише прикладом чи швидше псевдокодом. Ну, я вважаю вашу стурбованість, і я її відредагував ..
InfantPro'Aravind '

36

Якщо я можу запропонувати кілька пропозицій (через два роки, але, маю надію, корисні майбутнім читачам) :

  • Виділення загального h2 елемент.
  • Виділення загального ooooooooooooo текст.
  • Будьте в курсі нової if/then/elseконструкції XPath 2.0, якщо використовуєте 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

Найбільш прямолінійний підхід - це зробити другий тест, якщо перевернутий стан. Цей прийом коротший, простіший на очах і легший у виборі права, ніж блок, який вводиться іншим способом:

<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тест відповідає доповненню першого, зробить будь-яку наступну модифікацію більш схильною до помилок.
Філіп-Андре Лорін

2
Я згоден, пал. Крім того, я вважаю, що вищезазначений приклад важче прочитати, тоді як використання <xsl:choose>значень би було набагато простішим, його значення набагато більш зрозумілим.
Дуг Барб’єрі

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>

Мій вихід

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.