XSL在循环中排序

时间:2014-10-15 17:56:56

标签: xml sorting loops xslt

我需要帮助弄清楚如何在下面的示例中对价格进行排序...例如,按升序排列。正如你所看到的,我已经尝试过但它不起作用...我认为因为我只获得某些版本号大于或等于1的元素

<?xml version="1.0" encoding="ISO8859-1"?>

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

<xsl:template match ="/">
        <html>
            <head>
                <title>Apps List</title>
            </head>
            <body>
                <h1>Application List</h1>
                <table border="1">
                    <tr>
                        <th>Name</th>
                        <th>Type</th>
                        <th>Version</th>
                        <th>Price</th>
                    </tr>
                    <!-- for loop start-->
                    <xsl:for-each select="app/appCategory">
                        <xsl:sort select="appType/@price" order="ascending" data-type="number" />
                        <xsl:variable name="appType" select="@type"/>
                            <!-- for loop start-->
                            <xsl:for-each select="appItem">
                                <!-- if statement start-->
                                <xsl:if test = "@version &#62;&#61; 1"> <!-- &#62;&#61; means >= -->
                                    <tr>
                                        <td><xsl:value-of select="."/></td>
                                        <td><xsl:value-of select="$appType"/></td>
                                        <td><xsl:value-of select="@version"/></td>
                                        <td>&#xA3;<xsl:value-of select="@price"/></td>
                                    </tr>
                                </xsl:if>
                            </xsl:for-each>
                    </xsl:for-each>
                </table>
            </body>
        </html>
</xsl:template>
</xsl:stylesheet>

这是XML文件:

<?xml version="1.0" encoding="ISO8859-1" ?>
<?xml-stylesheet type="text/xsl" href="q2.xsl"?>

<app>
    <appCategory type="Productivity">
        <appItem fileName="Messages" version="0.2" price="34.99">Thunderbird</appItem>
        <appItem fileName="Contacts" version="2.0" price="3.00">Convenience Book</appItem>
        <appItem fileName="Calendar" version="1.0" price="45.00">ForgetMilk</appItem>
        <appItem fileName="Email" version="1.3" price="3.45">Email</appItem>
    </appCategory>
    <appCategory type="Games">
        <appItem fileName="BrickBreaker" version="7.1" price="14.99">Brick Breaker</appItem>
        <appItem fileName="WordMole" version="4.1" price="22.99">Word Mole</appItem>
        <appItem fileName="FistOfAwesome" version="4.1" price="3.99">Fist of Awesome</appItem>      
    </appCategory>
    <appCategory type="Social networking">
        <appItem fileName="BlackBerry Messenger" version="0.2" price="0.99">Blackberry Messenger</appItem>
        <appItem fileName="Twitter" version="1.1" price="24.99">Twitter</appItem>
        <appItem fileName="Facebook" version="0.5" price="44.99">Facebook</appItem>
        <appItem fileName="Grodog" version="0.5" price="1.99">Grodog</appItem>
        <appItem fileName="LinkedIn" version="2.1" price="3.59">LinkedIn</appItem>
        <appItem fileName="YouTube" version="5.5" price="1.59">YouTube</appItem>
    </appCategory>
</app>

1 个答案:

答案 0 :(得分:0)

<xsl:for-each>一起使用时,定义输入序列的排序键的<xsl:sort>元素必须显示为for-each的第一个子元素,并且它们适用于由封闭的每个选择的项目。现在编写模板的方式似乎是尝试对包含价格序列的排序键上的<appCategory>元素进行排序。这可能不是你想要的。

另外,您使用&#34; appType&#34;令人困惑。它确实是源文档中的元素名称,正如XSL似乎暗示的那样,还是只是变量名?我猜测后者。

如果没有正在转换的文档的架构,很难确定您需要什么。我猜测输入文档可能有这种形式(模板或多或少暗示):

<app>
  <appCategory type='type1'>
    <appItem version='0' price='2.00'>item1</appItem>
    <appItem version='1' price='1.00'>item1</appItem>
    <appItem version='1' price='2.00'>item2</appItem>
    <appItem version='2' price='2.50'>item2</appItem>
  </appCategory>
  <appCategory type='type2'>
    <appItem version='57' price='200.00'>item3</appItem>
  </appCategory>
</app>

在这种情况下,如果您想按价格对所有类别中的<appItem>元素进行排序,那么您需要更多类似的内容:

<!-- select all the items to be sorted and output -->
<xsl:for-each select="app/appCategory/appItem[@version &gt;= 1]">
  <!-- sort key for the input sequence selected by the for-each -->
  <xsl:sort select="@price" order="ascending" data-type="number" />
  <!-- sequence constructor for the transformed result -->
  <tr>
    <td><xsl:value-of select="."/></td>
    <td><xsl:value-of select="../@type"/></td>
    <td><xsl:value-of select="@version"/></td>
    <td>&#xA3;<xsl:value-of select="@price"/></td>
  </tr>
</xsl:for-each>