关键词:
【中文标题】XSLT 1.0 对节点进行分组和计数【英文标题】:XSLT 1.0 group and count nodes 【发布时间】:2014-06-10 19:44:04 【问题描述】:我有带有模块的 XML,里面有一些部分......
<?xml version="1.0"?>
<root>
<modul id="1">
<part id="01" part_number="AAA"/>
<part id="02" part_number="AAA"/>
<part id="03" part_number="AAA"/>
<part id="04" part_number="BBB"/>
</modul>
<modul id="2">
<part id="05" part_number="AAA"/>
<part id="06" part_number="AAA"/>
<part id="07" part_number="CCC"/>
<part id="08" part_number="BBB"/>
</modul>
</root>
我想在每个模块中按 part_number 分组并计算节点出现次数:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="keyPartNumber" match="part" use="@part_number"/>
<xsl:template match="/">
<xsl:for-each select="root/modul">
<modul name="@id">
<xsl:for-each select="part[generate-id() = generate-id(key('keyPartNumber',@part_number)[1])]">
<xsl:sort select="@part_number" order="ascending" data-type="text"/>
<node title="@part_number (quantity: count(key('keyPartNumber',@part_number)))" />
</xsl:for-each>
</modul>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
但结果我得到的不是我想要的:
<?xml version="1.0" encoding="UTF-8"?>
<modul name="1">
<node title="AAA (quantity: 5)"/>
<node title="BBB (quantity: 2)"/>
</modul>
<modul name="2">
<node title="CCC (quantity: 1)"/>
</modul>
例外结果将是:
<?xml version="1.0" encoding="UTF-8"?>
<modul name="1">
<node title="AAA (quantity: 3)"/>
<node title="BBB (quantity: 1)"/>
</modul>
<modul name="2">
<node title="AAA (quantity: 2)"/>
<node title="BBB (quantity: 1)"/>
<node title="CCC (quantity: 1)"/>
</modul>
我怎样才能意识到这一点?是否可以为每个模块动态创建密钥?
【问题讨论】:
【参考方案1】:这是因为您需要将 modul id 作为键的一部分包含在内,以便各个部分因模块而异
<xsl:key name="keyPartNumber" match="part" use="concat(../@id, '|', @part_number)"/>
注意这里的|
可以是任何东西,只要它不在 id 或 part_number 中即可。
您也将在访问密钥时使用相同的 concat 语句。
试试这个 XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="keyPartNumber" match="part" use="concat(../@id, '|', @part_number)"/>
<xsl:template match="/">
<xsl:for-each select="root/modul">
<modul name="@id">
<xsl:for-each select="part[generate-id() = generate-id(key('keyPartNumber',concat(../@id, '|', @part_number))[1])]">
<xsl:sort select="@part_number" order="ascending" data-type="text"/>
<node title="@part_number (quantity: count(key('keyPartNumber',concat(../@id, '|', @part_number))))" />
</xsl:for-each>
</modul>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
【讨论】:
【参考方案2】:或者,您可以在“modul”中使用一个变量来存储它的@id,并使用它来过滤当前“root/modul”中的那些“部分”:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="keyPartNumber" match="part" use="@part_number"/>
<xsl:template match="/">
<root>
<xsl:for-each select="root/modul">
<xsl:variable name="id" select="@id"/>
<modul name="@id">
<xsl:for-each select="part[generate-id() = generate-id(key('keyPartNumber',@part_number)[parent::*[@id = $id]][1])]">
<xsl:sort select="@part_number" order="ascending" data-type="text"/>
<node title="@part_number (quantity: count(key('keyPartNumber',@part_number)[parent::*[@id = $id]]))" />
</xsl:for-each>
</modul>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
【讨论】:
XSLT 1.0 按子节点的值对 xml 节点进行分组
】XSLT1.0按子节点的值对xml节点进行分组【英文标题】:XSLT1.0Groupingxmlnodesbyvalueofachild【发布时间】:2021-03-1410:22:20【问题描述】:我正在使用XSLT1.0我有一条正在尝试转换的输入消息。此输入消息具有以下冗余结构,由A、B、Order... 查看详情
XSLT 1.0 由多个子节点分组的父节点分组
】XSLT1.0由多个子节点分组的父节点分组【英文标题】:XSLT1.0Groupingofparentnodegroupedbymultiplechildnodes【发布时间】:2021-12-0506:11:25【问题描述】:我正在尝试基于多个子节点进行分组,然后显示由子节点分组的父节点。我已经缩小... 查看详情
在 XSLT 中对每个父节点下的子节点进行分组
】在XSLT中对每个父节点下的子节点进行分组【英文标题】:GroupingChildnodesundereachParentnodesinXSLT【发布时间】:2018-04-2004:16:54【问题描述】:我是XSLT分组概念的新手。我正在尝试使用XSLT2.0对以下XML进行分组。<Root><Entry><... 查看详情
是否可以使用 XSLT 1.0 对条目进行分组?
】是否可以使用XSLT1.0对条目进行分组?【英文标题】:IsitpossibletogroupentriesusingXSLT1.0?【发布时间】:2021-11-0808:49:55【问题描述】:我正在研究一种使XML选择列表更易于阅读的方法。数据看起来像这样:<data><entry><custom... 查看详情
XSLT 1.0:分组和删除重复项
...121:50:43【问题描述】:我有一个xml分组挑战,我需要对其进行分组并删除重复项,如下所示:<Person><name>John</name><date>June12</date><workTimetaskID=1& 查看详情
如何在下面的 XSLT 1.0 代码中进行分组。需要按 TaxRateCode 分组
】如何在下面的XSLT1.0代码中进行分组。需要按TaxRateCode分组【英文标题】:HowtogroupbyinXSLT1.0codebelow.NeedtogroupbyTaxRateCode【发布时间】:2021-12-2301:17:33【问题描述】:我需要根据“TaxRateCode”标签进行分组并根据“LineType/Code=\'AWT\'”... 查看详情
XSLT 1.0 - 连接已知子节点,按未知父节点分组
】XSLT1.0-连接已知子节点,按未知父节点分组【英文标题】:XSLT1.0-Concatenateknownchildnodes,groupbyunknownparent【发布时间】:2012-08-2112:31:36【问题描述】:我想变身<entry><parent1><object_id>1580</object_id></parent1><parent... 查看详情
使用 XSLT 对 HTML 输出进行分组(muenchian 分组?)
】使用XSLT对HTML输出进行分组(muenchian分组?)【英文标题】:GroupaHTMLoutputwithXSLT(muenchiangrouping?)【发布时间】:2017-11-1322:11:23【问题描述】:我想以一种特殊的方式对输出进行分组,也许使用muenchian分组?但我卡住了这是XML文... 查看详情
基于列表中的日期字段在每一天使用 XSLT 1.0 对列表进行分组
】基于列表中的日期字段在每一天使用XSLT1.0对列表进行分组【英文标题】:GroupingaListwithXSLT1.0oneachsingleDaybasedonaDate-FieldwithintheList【发布时间】:2018-11-1208:40:02【问题描述】:我有以下XML作为示例,并希望得到这个结果:20.06.2016... 查看详情
for-each 并使用 xslt 对 xml 进行排序和分组
...abc,我需要获取标题并设置值。任何集合值都符合在集合节点内按升序添加标题值的需要。在这里,我确实对cat值进行了硬编码。但在我的场景中 查看详情
XSLT 1.0:按属性分组
...【问题描述】:我有以下简化的XML数据,我想按类别对其进行分组:<Root><Rows><Row><Columnname="Title"Value="Document1"/><Columnname="Category"Value="Categor 查看详情
使用 XSLT 程序对具有逗号分隔值的 XML 元素进行分组
】使用XSLT程序对具有逗号分隔值的XML元素进行分组【英文标题】:GroupXMLelementswithcommaseperatedvalueswithXSLTprogram【发布时间】:2021-12-3011:20:06【问题描述】:我们是xslt编程的新手,请您帮助我们处理xslt程序。我们需要根据“id”标... 查看详情
XSLT 1.0 将同一级别的多个相同节点以不同的值分组
】XSLT1.0将同一级别的多个相同节点以不同的值分组【英文标题】:XSLT1.0groupingmultiplesamenodesonsamelevelwithdifferentvalues【发布时间】:2015-03-2006:00:00【问题描述】:我有一个元素列表:<vehiciles><vehicilevalue="_CAR">CAR</vehicile&g... 查看详情
在 DotNetNuke 表单和列表中使用 XSLT 对项目进行分组
】在DotNetNuke表单和列表中使用XSLT对项目进行分组【英文标题】:GroupitemswithXSLTinDotNetNukeFormandList【发布时间】:2011-05-1214:20:40【问题描述】:我必须使用表单和列表(DotNetNuke模块)和XSLT对一组项目进行分组。XML:<UserDefinedTab... 查看详情
我无法理解 XSLT 1.0 Muenchian 分组
...6:40:23【问题描述】:我基本上只是试图按容器ID对DCLDET段进行分组,所以我可以创建一个额外的标记,即<Carton><Container_Id><SKU><Qty_Shipped></ 查看详情
XSLT 循环排序将以下节点向上移动
】XSLT循环排序将以下节点向上移动【英文标题】:XSLTSortofLoopsshiftedsomebelownodesup【发布时间】:2022-01-0403:28:16【问题描述】:我的XSLT逻辑不工作。我们能否检查一下为什么它没有对S5_Loop进行排序但它将L3和SE部分移到S5_Loop上方... 查看详情
使用 XSLT 1.0 对值进行分组
】使用XSLT1.0对值进行分组【英文标题】:GroupvalueswithXSLT1.0【发布时间】:2016-01-2505:41:34【问题描述】:希望你能帮助我;我有这个xsl代码:<xsl:for-eachselect="//DataSet"><xsl:sortselect="@wert"/><xsl:sortselect="@key"/><tr><td... 查看详情
如何对 SQL 表中 XML 列中的节点进行分组计数?
】如何对SQL表中XML列中的节点进行分组计数?【英文标题】:HowtogroupcountanodeinanXMLcolumninaSQLtable?【发布时间】:2021-11-1703:47:26【问题描述】:我有一些XML数据存储在SQL表的列中,我需要获取其中一个XML项目组计数的所有变量。查... 查看详情