我需要帮助弄清楚如何在下面的示例中对价格进行排序...例如,按升序排列。正如你所看到的,我已经尝试过但它不起作用...我认为因为我只获得某些版本号大于或等于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 >= 1"> <!-- >= means >= -->
<tr>
<td><xsl:value-of select="."/></td>
<td><xsl:value-of select="$appType"/></td>
<td><xsl:value-of select="@version"/></td>
<td>£<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>
答案 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 >= 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>£<xsl:value-of select="@price"/></td>
</tr>
</xsl:for-each>