XSLT变量不起作用

时间:2011-05-02 16:19:25

标签: xslt

我有以下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 个答案:

答案 0 :(得分:1)

存在多个问题:

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

答案 1 :(得分:0)

<强>替换

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

您是否注意到<xsl:if>“神奇地”消失了?

当然,这段代码可以进一步改进,但是你既没有提供要应用转换的XML文档的实例,也没有提供所需的输出。