Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在xsl中具有相同名称的多个块之间按块排序和分组_Xml_Sorting_Xslt - Fatal编程技术网

Xml 在xsl中具有相同名称的多个块之间按块排序和分组

Xml 在xsl中具有相同名称的多个块之间按块排序和分组,xml,sorting,xslt,Xml,Sorting,Xslt,XML结构: <AvailableList> <TimePeriod> <DetailPeriod Name="c"> <Rate>0.0</Rate> </DetailPeriod> <DetailPeriod Name="a"> <Rate>1.0</Rate> </Det

XML结构:

<AvailableList>
    <TimePeriod>
       <DetailPeriod Name="c">
           <Rate>0.0</Rate>
       </DetailPeriod>
       <DetailPeriod Name="a">
           <Rate>1.0</Rate>
       </DetailPeriod>
       <DetailPeriod Name="b">
           <Rate>0.0</Rate>
       </DetailPeriod>
    </TimePeriod>
</AvailableList>
<AvailableList>
    <TimePeriod>
       <DetailPeriod Name="c">
           <Rate>0.0</Rate>
       </DetailPeriod>
    </TimePeriod>
</AvailableList>
<AvailableList>
    <TimePeriod>
       <DetailPeriod Name="e">
           <Rate>2.0</Rate>
       </DetailPeriod>
       <DetailPeriod Name="f">
           <Rate>0.0</Rate>
       </DetailPeriod>
    </TimePeriod>
</AvailableList>

0
1
0
0
2
0
我需要每个AvailableList按“Rate”分组,然后按属性“Name”排序

修改后的XML结构应为:

<AvailableList>
    <TimePeriod>
       <DetailPeriod Name="b">
           <Rate>0.0</Rate>
       </DetailPeriod>
       <DetailPeriod Name="c">
           <Rate>0.0</Rate>
       </DetailPeriod>
       <DetailPeriod Name="a">
           <Rate>1.0</Rate>
       </DetailPeriod>
    </TimePeriod>
</AvailableList>
<AvailableList>
    <TimePeriod>
       <DetailPeriod Name="c">
           <Rate>0.0</Rate>
       </DetailPeriod>
    </TimePeriod>
</AvailableList>
<AvailableList>
    <TimePeriod>
       <DetailPeriod Name="e">
           <Rate>2.0</Rate>
       </DetailPeriod>
       <DetailPeriod Name="f">
           <Rate>0.0</Rate>
       </DetailPeriod>
    </TimePeriod>
</AvailableList>

0
0
1
0
2
0
我有以下xslt代码:

xsl:key name=“RatesKey”match=“DetailPeriod”use=“Rate”/



我仍在尝试分组和排序。当我第一次打印$varCount的值时,当Rate=0.0时,我希望看到varCount=2,但是我看到的是varCount=4。它正在考虑所有的时间段块。如何将代码更改为按每个时间段块进行分组和排序?

您实际上不需要任何分组来实现问题中给出的所需输出,只需要两级排序,首先按速率进行数字排序,然后按名称进行字母排序

<xsl:for-each select="DetailPeriod">
  <xsl:sort select="Rate" data-type="number" />
  <xsl:sort select="@Name" />

但一般来说,当您想将Muenchian分组限制为在特定父元素内分组时,需要将该元素特有的内容作为键值的一部分,例如

<xsl:key name="RatesKey" match="DetailPeriod"
  use="concat(generate-id(ancestor::AvailableList[1]), '|', Rate)" />

<xsl:for-each select="DetailPeriod[generate-id() = generate-id(
  key('RatesKey', concat(generate-id(current()/..), '|', Rate))[1])]">

感谢您清理了明钦族的组织。我需要节点集/组来进一步处理此XML,因此两级排序是不够的。
<xsl:key name="RatesKey" match="DetailPeriod"
  use="concat(generate-id(ancestor::AvailableList[1]), '|', Rate)" />

<xsl:for-each select="DetailPeriod[generate-id() = generate-id(
  key('RatesKey', concat(generate-id(current()/..), '|', Rate))[1])]">