【问题标题】:XSLT: Sorting and Grouping Keys with Multiple ValuesXSLT:对具有多个值的键进行排序和分组
【发布时间】:2017-03-19 11:48:39
【问题描述】:

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

对于每个作业,都有一个相关时间,具有两个值 Num1 和 Num2。
我想按这些值排序,所以如果:
job1 的 time1 值为 Num1=10、Num2=12 和
job2 的 time2 值为 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>

【问题讨论】:

  • 您有一个元素&lt;Type&gt;&lt;Class IRI="Times"/&gt;&lt;Name IRI="Time2"/&gt;&lt;/Type&gt;,它不会在任何地方使用,因为所有Data 元素都有&lt;Name IRI="Time1"/&gt;。所以要么我不理解输入数据的结构(你需要解释哪些元素代表工作,哪些时间,它们是如何相关的)或者你的输入样本不一致。
  • 糟糕,我的错!我编辑了xml。第二部分的所有时间都是 Time2(对于 Job2)。每项工作都与一次且仅一次相关。

标签: xml sorting xslt xslt-1.0 grouping


【解决方案1】:

我不知道你为什么还要问关于分组的问题,至于可以做的交叉引用和排序

<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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 2023-02-10
    • 2012-01-06
    • 2017-12-02
    • 2013-09-14
    • 2023-03-14
    相关资源
    最近更新 更多