Xml 在xsl中具有相同名称的多个块之间按块排序和分组
XML结构: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
<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])]">