我有一个包含价格值的XML文件。我想按价格排序我的表:这是我的代码,但在IE中它不起作用,其他元素的价值一起显示在price tabledata中:
<td>
<xsl:apply-templates >
<xsl:sort select="price" data-type="number" order="descending" />
</xsl:apply-templates>
</td>
和我的xml文件(book.xml)
这是我的XSLT文件:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="catalog">
<html>
<head>
<title>
<xsl:text>Buchhandlung</xsl:text>
</title>
</head>
<table border="1">
<tr>
<th>id</th>
<th>author</th>
<th>titel</th>
<th>price</th>
<th>description</th>
</tr>
<xsl:apply-templates />
</table>
</html>
</xsl:template>
<xsl:template match="book">
<tr>
<td>
<xsl:apply-templates select="@id" />
</td>
<td>
<xsl:apply-templates select="author" />
</td>
<td>
<xsl:apply-templates select="title" />
</td>
<td>
<xsl:apply-templates select="book" >
<xsl:sort select="price" data-type="number" order="descending" />
</xsl:apply-templates>
</td>
<!--<td>
<xsl:apply-templates select="price" />
</td>-->
<td>
<xsl:apply-templates select="description" />
</td>
</tr>
</xsl:template>
<
/ XSL:样式表&GT;
感谢您的帮助
答案 0 :(得分:3)
sort
本身不会产生输出。它规定了排序节点集传递给当前范围内任何内容的顺序 - 因此您需要在其下面添加<xsl:value-of select="price"/>
之类的内容 - 指令值将按照以下顺序打印出价格大小而不是文件的自然顺序。
编辑#1:我现在已经注意到您在apply-templates
内使用它而不是for-each
。在这种情况下,您需要定义与price
节点匹配的模板。然后,将按排序顺序在每个价格节点上调用此模板,而不是在文件中调用它们。
编辑#2:一个例子;要按照书的价格打印书籍详细信息列表,您可能需要以下内容:
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="catalog">
<html>
<head>
<title>
<xsl:text>Buchhandlung</xsl:text>
</title>
</head>
<table border="1">
<tr>
<th>id</th>
<th>author</th>
<th>titel</th>
<th>price</th>
<th>description</th>
</tr>
<xsl:apply-templates select="book">
<xsl:sort select="price"/>
</xsl:apply-templates>
</table>
</html>
</xsl:template>
<xsl:template match="book">
<tr>
<td>
<xsl:apply-templates select="@id" />
</td>
<td>
<xsl:apply-templates select="author" />
</td>
<td>
<xsl:apply-templates select="title" />
</td>
<td>
<xsl:apply-templates select="description" />
</td>
</tr>
</xsl:template>
请注意,目录模板现在包含排序逻辑,我已从书籍模板中删除了类似的逻辑。书籍模板无权对传递给它的节点进行排序,您必须指定目标节点传递给书籍模板的顺序,以获得您所追求的结果。目录模板确保每个book
元素按价格顺序传递到template match="book"
,而不是文件中的顺序。我假设您不想在图书详细信息中打印图书价格,因为您提供的示例也不会这样做,但如果您想要包含此信息,则将以与完全相同的方式完成其他字段的td
输出。
答案 1 :(得分:1)
您需要符合
的代码<xsl:template match="catalog">
<table>
<tbody>
<xsl:apply-templates select="book">
<xsl:sort select="price" data-type="number" order="descending"/>
</xsl:appl-templates>
</tbody>
</table>
</xsl:template>
<xsl:template match="book">
<tr>
<xsl:apply-templates/>
</tr>
</xsl:template>
<xsl:template match="book/*">
<td>
<xsl:value-of select="."/>
</td>
</xsl:template>