Переменная XSLT не работает - PullRequest
2 голосов
/ 02 мая 2011

У меня есть следующий фрагмент кода XSLT:

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">

<xsl:variable name="condition">(coasts='Adriatic Sea')or(coasts='Mediterranean Sea')</xsl:variable>
<xsl:template match="cia">
    <html>
     <head></head>
     <body>
      <table border="1">
       <tr>
        <th>Country</th>
        <th>Capital</th>
        <th>Area</th>
        <th>Population</th>
        <th>Inflation rate</th>
       </tr> 
       <xsl:for-each select="country">
        <xsl:if test="{$condition}">
        <tr>
         <td>
          <xsl:value-of select="@name"/>
         </td>
         <td>
          <xsl:value-of select="@capital"/>
         </td> 
         <td>
          <xsl:value-of select="@total_area"/>
         </td> 
         <td>
          <xsl:value-of select="@population"/>
         </td> 
         <td>
          <xsl:value-of select="@inflation"/>
         </td>
        </tr>
        </xsl:if>
       </xsl:for-each>
      </table>
     </body>
    </html>
  </xsl:template> 
</xsl:stylesheet>

Если поместить условное выражение непосредственно в элемент if, то код работает нормально, однако моя проблема заключается в том, что когда я назначаю переменному то же условное выражение и затем ссылаюсь на него в элементе if, он не работает. Я делаю что-то неправильно? Это возможно? Спасибо!

Ответы [ 2 ]

1 голос
/ 02 мая 2011

Есть несколько проблем:

  • Скобки в <xsl:if test="{$condition}"> не нужны; используйте <xsl:if test="$condition">
  • Используйте следующую xsl:variable конструкцию:

    <xsl:variable name="condition" 
            select="(coasts='Adriatic Sea')or(coasts='Mediterranean Sea')"/>
    
  • Когда у вас было условие в вашем xsl:if, тест проводился относительно каждого country. Это не относится к переменной верхнего уровня. Значением переменной является результат выражения, а не выражение само . Если вы настаиваете на переменной, то инициализируйте ее внутри цикла.

См. Следующую таблицу стилей:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.w3.org/1999/xhtml">
    <xsl:template match="cia">
        <html>
            <head></head>
            <body>
                <table border="1">
                    <tr>
                        <th>Country</th>
                        <th>Capital</th>
                        <th>Area</th>
                        <th>Population</th>
                        <th>Inflation rate</th>
                    </tr>
                    <xsl:for-each select="country">
                        <xsl:variable name="condition"
                            select="(coasts='Adriatic Sea') or 
                                    (coasts='Mediterranean Sea')" />
                        <xsl:if test="$condition">
                            <tr>
                                <td>
                                    <xsl:value-of select="@name" />
                                </td>
                                <td>
                                    <xsl:value-of select="@capital" />
                                </td>
                                <td>
                                    <xsl:value-of select="@total_area" />
                                </td>
                                <td>
                                    <xsl:value-of select="@population" />
                                </td>
                                <td>
                                    <xsl:value-of select="@inflation" />
                                </td>
                            </tr>
                        </xsl:if>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Введите:

<cia>
    <country name="test1" inflation="22">
        <coasts>Adriatic Sea</coasts>
    </country>
    <country name="test2" inflation="7">
        <coasts>No match</coasts>
    </country>
</cia>

Вывод (только первый country проходит тест):

<html xmlns="http://www.w3.org/1999/xhtml">
    <head></head>
    <body>
        <table border="1">
            <tr>
                <th>Country</th>
                <th>Capital</th>
                <th>Area</th>
                <th>Population</th>
                <th>Inflation rate</th>
            </tr>
            <tr>
                <td>test1</td>
                <td></td>
                <td></td>
                <td></td>
                <td>22</td>
            </tr>
        </table>
    </body>
</html>

Обратите внимание, что вам даже не нужно отдельное условие; лучше выбрать только нужные элементы в первую очередь. Этот цикл выдает тот же результат:

<xsl:for-each
    select="country[(coasts='Adriatic Sea') or
                     coasts='Mediterranean Sea')]">
    <tr>
        <td>
            <xsl:value-of select="@name" />
        </td>
        <td>
            <xsl:value-of select="@capital" />
        </td>
        <td>
            <xsl:value-of select="@total_area" />
        </td>
        <td>
            <xsl:value-of select="@population" />
        </td>
        <td>
            <xsl:value-of select="@inflation" />
        </td>
    </tr>
</xsl:for-each>
0 голосов
/ 03 мая 2011

Заменить

                <xsl:for-each select="country"> 

с

               <xsl:apply templates select="country"/>

также добавьте эти шаблоны :

 <xsl:template match="country"/>

 <xsl:template match=
  "country[coasts='Adriatic Sea' 
         or                                        
           coasts='Mediterranean Sea'
         ]">
<xsl:template match=
  "country[coasts='Adriatic Sea'
         or
           coasts='Mediterranean Sea'
         ]">
    <tr>
        <td>
            <xsl:value-of select="@name"/>
        </td>
        <td>
            <xsl:value-of select="@capital"/>
        </td>
        <td>
            <xsl:value-of select="@total_area"/>
        </td>
        <td>
            <xsl:value-of select="@population"/>
        </td>
        <td>
            <xsl:value-of select="@inflation"/>
        </td>
    </tr>
</xsl:template>

Вы заметили, что "1016 *" волшебным образом "исчез?

Конечно, этот код может быть улучшен еще больше , но вы не предоставили ни экземпляра документа XML, к которому должно применяться преобразование, ни желаемого вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...