【问题标题】:Combining 2 Muenchian Groups into 1 with XSLT 1.0使用 XSLT 1.0 将 2 个 Muenchian 组合并为 1 个
【发布时间】:2018-04-17 16:16:39
【问题描述】:

我的任务是尝试将 2 个单独的“组”合并为 1 个,然后按日期排序。 Muenchian 分组是我认为进行初始分组的最佳方式,但是我需要将它们组合起来,并按日期排序,这样我就可以遍历集体结果并输出它们。我仅限于 XSLT 1.0。这是一些示例代码:

<?xml version="1.0" encoding = "UTF-8"?>
<events>
    <event>
        <name>Event1</name>
        <history>
            <pastevent>
            <date>01/01/1999</date>
            </pastEvent>
            <pastevent>
            <date>01/01/2000</date>
            </pastEvent>
            <pastevent>
            <date>01/01/2001</date>
            </pastEvent>
            <pastevent>
            <date>01/01/2002</date>
            </pastEvent>
        </history>
        <currentEvents>
            <date>01/01/2019</date>
            <date>01/01/2019</date>
            <date>01/01/2019</date>
            <date>01/01/2019</date>
            <date>01/01/2019</date>
            <date>01/01/2019</date>
        </currentEvents>
    </event>
    <event>
        <name>Event2</name>
        <history>
            <pastevent>
            <date>02/01/1999</date>
            </pastEvent>
            <pastevent>
            <date>02/01/2000</date>
            </pastEvent>
            <pastevent>
            <date>02/01/2001</date>
            </pastEvent>
            <pastevent>
            <date>02/01/2002</date>
            </pastEvent>
        </history>
        <currentEvents>
            <date>02/01/2019</date>
            <date>02/01/2019</date>
            <date>02/01/2019</date>
            <date>02/01/2019</date>
            <date>02/01/2019</date>
            <date>02/01/2019</date>
        </currentEvents>
    </event>
</events>

我知道我可以为过去的事件和当前日期创建组,但我将如何将两者组合成一个组以获得类似于此的输出:

Events
Date         Event
01/01/1999   Event1
02/01/1999   Event2
01/01/2000   Event1
02/01/2000   Event2

正如我所说,我可以完成创建 2 个独立的 Muenchian 小组的工作。 1 组用于当前事件,1 组用于过去事件,但我将如何将它们变成 1 个单数组?

谢谢!

【问题讨论】:

  • 我的回答有帮助还是您还有问题?
  • 大声抱歉。您的回答确实解决了我的问题,抱歉没有早点标记。

标签: xml xslt xslt-1.0 grouping


【解决方案1】:

不要将过去事件日期和当前事件日期分成两个单独的组,而是将所有日期分组,无论它们出现在哪里。

您还可以重新排列日期值以进行排序。请注意,在我的示例中,我假设您的日期格式为 MM/DD/YYYY。如果我假设不正确,您可能需要更改排序选择。

示例...

XML 输入(将 &lt;pastevent&gt; 更改为 &lt;pastEvent&gt; 以使其格式正确)

<events>
    <event>
        <name>Event1</name>
        <history>
            <pastEvent>
                <date>01/01/1999</date>
            </pastEvent>
            <pastEvent>
                <date>01/01/2000</date>
            </pastEvent>
            <pastEvent>
                <date>01/01/2001</date>
            </pastEvent>
            <pastEvent>
                <date>01/01/2002</date>
            </pastEvent>
        </history>
        <currentEvents>
            <date>01/01/2019</date>
            <date>01/01/2019</date>
            <date>01/01/2019</date>
            <date>01/01/2019</date>
            <date>01/01/2019</date>
            <date>01/01/2019</date>
        </currentEvents>
    </event>
    <event>
        <name>Event2</name>
        <history>
            <pastEvent>
                <date>02/01/1999</date>
            </pastEvent>
            <pastEvent>
                <date>02/01/2000</date>
            </pastEvent>
            <pastEvent>
                <date>02/01/2001</date>
            </pastEvent>
            <pastEvent>
                <date>02/01/2002</date>
            </pastEvent>
        </history>
        <currentEvents>
            <date>02/01/2019</date>
            <date>02/01/2019</date>
            <date>02/01/2019</date>
            <date>02/01/2019</date>
            <date>02/01/2019</date>
            <date>02/01/2019</date>
        </currentEvents>
    </event>
</events>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="dates" match="date" use="."/>

  <xsl:template match="/events">
    <xsl:text>Events&#xA;</xsl:text>
    <xsl:text>Date&#x9;&#x9;&#x9;Event&#xA;</xsl:text>
    <xsl:for-each select=".//date[count(.|key('dates',.)[1])=1]">
      <xsl:sort 
        select="concat(substring(.,7,4),substring(.,1,2),substring(.,4,2))" 
        data-type="number" 
        order="ascending"/>
      <xsl:value-of select="concat(.,'&#x9;&#x9;',ancestor::event/name,'&#xA;')"/>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

输出

Events
Date            Event
01/01/1999      Event1
02/01/1999      Event2
01/01/2000      Event1
02/01/2000      Event2
01/01/2001      Event1
02/01/2001      Event2
01/01/2002      Event1
02/01/2002      Event2
01/01/2019      Event1
02/01/2019      Event2

小提琴:http://xsltfiddle.liberty-development.net/eiZQaEV/1

【讨论】:

    猜你喜欢
    • 2018-03-28
    • 2021-09-19
    • 2015-07-30
    • 2021-11-20
    • 2021-09-22
    • 1970-01-01
    • 2018-06-24
    • 2019-12-07
    • 1970-01-01
    相关资源
    最近更新 更多