gpt4 book ai didi

xml - xslt 按子元素计数排序

转载 作者:数据小太阳 更新时间:2023-10-29 02:58:41 26 4
gpt4 key购买 nike

我正在尝试通过查询 xml 文档来创建一个 html 表。我正在使用 xslt。

问题来了。 “父”节点包含许多“子”节点。我必须 o/p 一个表,其中包含按排序顺序(降序)的父节点的@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) &gt; 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>

最佳答案

提供的 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 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>

关于xml - xslt 按子元素计数排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8199560/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com