如何从xml文档中对EventTime进行排序?

时间:2015-06-03 18:52:08

标签: xml xslt

我想从我粘贴的示例xml文档中对EventTime进行排序。我想显示最新的EventTime

我的示例xml文档

<Integration xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:tsg="http://tsgweb.com" xmlns:IXML="http://tsgweb.com" xmlns:CMCodeQueryHelper="urn:CMCodeQueryHelper" PackageID="IXML Case Notification Test" MessageID="67085056" xmlns="">
    <Case InternalID="1617090499" ID="12125626" xmlns:user="http://tylertechnologies.com">
        <CaseEvent Date="05/22/2015" ID="160828152" InternalEventID="1721879467" xmlns:reslib="urn:reslib">
            <EventTime>8:49 AM</EventTime>
        </CaseEvent>
        <CaseEvent Date="05/28/2015" ID="160828600" InternalEventID="1721879818" xmlns:reslib="urn:reslib">
            <EventTime>1:39 PM</EventTime>
        </CaseEvent>
    </Case> 
</Integration>

要排序的xsl代码行

<xsl:sort select="substring-after-last(EventTime)" order="descending"/>

1 个答案:

答案 0 :(得分:0)

首先,XSLT中没有substring-after-last()函数 - 即使在XSLT 3.0中也没有。即使有这样的功能,它也需要 两个参数:一个字符串和一个分隔符。并且 - 最重要的是 - 我不知道这样的功能在这里会有什么帮助。

您输入的问题是EventTime值不是XSLT识别为时间的格式。为了避免将它们首先转换为有效时间然后再转换为可排序数字或字符串的临时步骤,您可以使用以下内容:

<xsl:template match="Case">
    <xsl:copy>
        <xsl:apply-templates select="CaseEvent">
            <!-- 1. AM before PM -->
            <xsl:sort select="substring-after(EventTime, ' ')" data-type="text" order="ascending"/>
            <!-- 2. 12th hour comes first -->
            <xsl:sort select="number(substring-before(EventTime, ':')='12')" data-type="number" order="descending"/>
            <!-- 3. Sort by hour -->
            <xsl:sort select="substring-before(EventTime, ':')" data-type="number" order="ascending"/>
            <!-- 4. Sort by minute -->
            <xsl:sort select="substring-before(substring-after(EventTime, ':'), ' ')" data-type="number" order="ascending"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>