XSLT 1.0 对节点进行分组和计数

     2023-02-16     95

关键词:

【中文标题】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项目组计数的所有变量。查... 查看详情