我试图通过查询xml文档来创建一个html表。我正在使用xslt。
这是问题所在。 “parent”节点包含许多“子”节点。我必须按照排序顺序(降序)对包含父项的@name和“子”节点计数的表进行操作。所以我在做
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="parent[count(child) > 3]">
<html>
<table border="1">
<xsl:for-each select=".">
<xsl:sort select="{count(child)}" data-type="number" order="descending"/>
<tr>
<td><b><xsl:value-of select="@name" /></b></td>
<td><xsl:value-of select="count(child)" /></td>
</tr>
</xsl:for-each>
</table>
</html>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
我得到html然而唯一的问题是我没有通过子元素的数量按排序顺序得到它。我怀疑我使用错误计数xsl:sort?你能帮忙吗?
输入xml
<outer>
<parent name="abc" attr1="22664136" attr2="647500">
<child percentage="11">aaa</child>
<child percentage="35">bbb</child>
<child percentage="50">ccc</child>
</parent>
<parent name="ggg" attr1="3249136" attr2="28750"/>
<parent name="ghi" attr1="29183032" attr2="2381740">
<child2>
<name>ppp</name>
<attr1>1507241</attr1>
</child2>
</parent>
<parent name="qwe" attr1="10342899" attr2="1246700"/>
<parent name="lkj" attr1="65647" attr2="440">
<child percentage="100">jjj</child>
</parent>
</outer>
答案 0 :(得分:3)
提供的XSLT代码中存在许多错误!
最大的问题在于:
<xsl:for-each select="."> <xsl:sort select="{count(child)}" data-type="number" order="descending"/> <tr> <td><b><xsl:value-of select="@name" /></b></td> <td><xsl:value-of select="count(child)" /></td> </tr> </xsl:for-each>
这不会执行任何有意义的排序,因为要排序的节点的节点集只包含一个节点 - 当前节点。
下一个问题就在这里:
<xsl:sort select="{count(child)}" data-type="number" order="descending"/>
XSLT指令的任何select
属性中不应该存在任何AVT - 您需要删除大括号。
第三个问题是排序太晚了 - 在模板parent
内部。父母没有自己有child
的孩子孩子。
解决方案:纠正上面讨论的所有主要问题,可能会得到以下代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/*">
<html>
<table border="1">
<xsl:for-each select="parent">
<xsl:sort select="count(child)" data-type="number" order="descending"/>
<tr>
<td>
<b>
<xsl:value-of select="@name" />
</b>
</td>
<td>
<xsl:value-of select="count(child)" />
</td>
</tr>
</xsl:for-each>
</table>
</html>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
将此转换应用于提供的XML文档:
<outer>
<parent name="abc" attr1="22664136" attr2="647500">
<child percentage="11">aaa</child>
<child percentage="35">bbb</child>
<child percentage="50">ccc</child>
</parent>
<parent name="ggg" attr1="3249136" attr2="28750"/>
<parent name="ghi" attr1="29183032" attr2="2381740">
<child2>
<name>ppp</name>
<attr1>1507241</attr1>
</child2>
</parent>
<parent name="qwe" attr1="10342899" attr2="1246700"/>
<parent name="lkj" attr1="65647" attr2="440">
<child percentage="100">jjj</child>
</parent>
</outer>
生成了需要排序的结果:
<html>
<table border="1">
<tr>
<td><b>abc</b></td>
<td>3</td>
</tr>
<tr>
<td><b>lkj</b></td>
<td>1</td>
</tr>
<tr>
<td><b>ggg</b></td>
<td>0</td>
</tr>
<tr>
<td><b>ghi</b></td>
<td>0</td>
</tr>
<tr>
<td><b>qwe</b></td>
<td>0</td>
</tr>
</table>
</html>
答案 1 :(得分:1)
几乎。您不需要围绕xsl:sort select="..."
的大括号
你的每个人都会看起来像:
<xsl:for-each select=".">
<xsl:sort select="count(child)" data-type="number" order="descending"/>
<tr>
<td><b><xsl:value-of select="@name" /></b></td>
<td><xsl:value-of select="count(child)" /></td>
</tr>
</xsl:for-each>
编辑:就像增加一点信息一样,你只在文字结果元素上使用花括号。 From the XSLT2.0 spec on attribute value templates:
以下示例从照片创建img结果元素 源中的元素; src和width属性的值是 使用包含在属性值中的XPath表达式计算 模板:
<xsl:variable name="image-dir" select="'/images'"/> <xsl:template match="photograph"> <img src="{$image-dir}/{href}" width="{size/@width}"/> </xsl:template>
答案 2 :(得分:0)
已经有一段时间了,所以我可能会错误地记住这一点,但我相信count(child)应该是count(child :: node())。