XSLT:使用多个值对键进行排序和分组

时间:2017-03-19 11:48:39

标签: xml sorting xslt xslt-1.0 grouping

我有一个包含以下内容的xml。我想根据相关时间的值对作业进行排序。

对于每个作业,有一个相关时间,其中两个值为Num1和Num2 我想按这些值排序,所以如果:
job1的time1的值为Num1 = 10,Num2 = 12和
job2具有时间2,其值为Num1 = 10,Num2 = 11 输出应该是:job2,job1。
如果job3的time3值为Num1 = 11,则Num2 = 09
输出应该是:job2,job1,job3。
我可以用xsl 1.0吗?

<Corp>
 <Type>
   <Class IRI="Jobs"/>
   <Name IRI="Job1"/>
 </Type>
 <Type>
   <Class IRI="Times"/>
   <Name IRI="Time1"/>
 </Type>
 <Relation>
   <RelClass IRI="Job-Time"/>
   <Name IRI="Job1"/>
   <Name IRI="Time1"/>
 </Relation>
 <Data>
   <DataClass IRI="Num1"/>
   <Name IRI="Time1"/>
   <Value>10</Value>
 </Data>
 <Data>
   <DataClass IRI="Num2"/>
   <Name IRI="Time1"/>
   <Value>12</Value>
 </Data>

 <Type>
   <Class IRI="Jobs"/>
   <Name IRI="Job2"/>
 </Type>
 <Type>
   <Class IRI="Times"/>
   <Name IRI="Time2"/>
 </Type>
 <Relation>
   <RelClass IRI="Job-Time"/>
   <Name IRI="Job2"/>
   <Name IRI="Time2"/>
 </Relation>
 <Data>
   <DataClass IRI="Num1"/>
   <Name IRI="Time2"/>
   <Value>10</Value>
 </Data>
 <Data>
   <DataClass IRI="Num2"/>
   <Name IRI="Time2"/>
   <Value>11</Value>
 </Data>    
 </Corp>

1 个答案:

答案 0 :(得分:0)

我不确定为什么你也会问关于分组,以及可以做的交叉引用和排序

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:key name="rel" match="Relation[RelClass/@IRI = 'Job-Time']" use="Name[1]/@IRI"/>

    <xsl:key name="num1" match="Data[DataClass/@IRI = 'Num1']" use="Name/@IRI"/>
    <xsl:key name="num2" match="Data[DataClass/@IRI = 'Num2']" use="Name/@IRI"/>

    <xsl:template match="/Corp">
        <xsl:copy>
            <xsl:apply-templates select="Type[Class/@IRI = 'Jobs']">
                <xsl:sort select="key('num1', key('rel', Name/@IRI)/Name[2]/@IRI)/Value" data-type="number"/>
                <xsl:sort select="key('num2', key('rel', Name/@IRI)/Name[2]/@IRI)/Value" data-type="number"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Type[Class/@IRI = 'Jobs']">
        <xsl:copy-of select="."/>
    </xsl:template>

</xsl:stylesheet>