按xslt排序并选择最小值或最大值 [英] Sorting in xslt and choosing minimum or maximum value

查看:98
本文介绍了按xslt排序并选择最小值或最大值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

需要一些帮助,以便进行排序,然后在XSLT中选择最大值或最小值.

Need some help in sorting and then choosing either maximum or minimum value in XSLT.

源xml:

<target>
<relatedTarget>
<permitExpiry>2005-07-02T08:11:00.000Z</permitExpiry>
<permitStart>2015-07-11T09:22:00.000Z</permitStart>
</relatedTarget>

<relatedTarget>
<permitExpiry>2003-07-12T08:11:00.000Z</permitExpiry>
<permitStart>2014-07-01T09:22:00.000Z</permitStart>
</relatedTarget>

<relatedTarget>
<permitExpiry>2002-07-10T08:11:00.000Z</permitExpiry>
<permitStart>2016-07-06T09:22:00.000Z</permitStart>
</relatedTarget>
</target>

结果xml:

<target>
<relatedTarget>
<permitStart>2014-07-01T09:22:00.000Z</permitStart>
<permitExpiry>2005-07-02T08:11:00.000Z</permitExpiry>
</relatedTarget>
</target>

基本上,我需要结果应具有所有开始日期中的最小许可开始日期和最大许可到期日期.

Basically i need the result should have minimum permitStart date and maximum permitExpiry date from among all the dates comming.

我的样本xsl:

<xsl:template match="/">


<xsl:variable name="permitStartVar" select="//permitStart"/>        
<xsl:variable name="permitStopVar" select="//permitExpiry"/>        

<xsl:for-each select="relatedTask">     
<xsl:sort select="substring(permitStart,1,4)" /> <!-- Year -->
<xsl:sort select="substring(permitStart,6,2)" /> <!-- Month -->
<xsl:sort select="substring(permitStart,9,2)" /> <!-- Day -->
<xsl:sort select="substring(permitStart,12,2)" /> <!-- Hour -->
<xsl:sort select="substring(permitStart,15,2)" /> <!-- Minute -->
<xsl:sort select="substring(permitStart,18,2)" /> <!-- Second -->


<xsl:sort select="substring(permitExpiry,1,4)" /> <!-- Year -->
<xsl:sort select="substring(permitExpiry,6,2)" /> <!-- Month -->
<xsl:sort select="substring(permitExpiry,9,2)" /> <!-- Day -->
<xsl:sort select="substring(permitExpiry,12,2)" /> <!-- Hour -->
<xsl:sort select="substring(permitExpiry,15,2)" /> <!-- Minute -->
<xsl:sort select="substring(permitExpiry,18,2)" /> <!-- Second --> 
</xsl:for-each>

<target>
<relatedTarget>
<permitStart><xsl:value-of select="$permitStartVar[1]"/></permitStart>
<permitExpiry><xsl:value-of select="$permitStopVar[last()]"/></permitExpiry>
</relatedTarget>    
</target>

</template>

推荐答案

按照我的方法,

<xsl:stylesheet exclude-result-prefixes="xs" version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="target">
  <xsl:variable name="permitStartVar" select="//permitStart"/>
  <xsl:variable name="permitStopVar" select="//permitExpiry"/>
  <xsl:variable name="temp">
     <xsl:for-each select="relatedTarget/permitStart">
        <xsl:sort select="substring(permitStart,1,4)"/>
        <!--Year-->
        <xsl:sort select="substring(permitStart,6,2)"/>
        <!--Month-->
        <xsl:sort select="substring(permitStart,9,2)"/>
        <!--Day-->
        <xsl:sort select="substring(permitStart,12,2)"/>            <!--Hour-->
        <xsl:sort select="substring(permitStart,15,2)"/>
        <!--Minute-->
        <xsl:sort select="substring(permitStart,18,2)"/>
        <!--Second-->
        <xsl:copy-of select="."/>
     </xsl:for-each>
  </xsl:variable>
  <xsl:variable name="temp1">
     <xsl:for-each select="relatedTarget/permitExpiry">
        <xsl:sort select="substring(permitExpiry,1,4)" order="descending"/>
        <!--Year-->
        <xsl:sort select="substring(permitExpiry,6,2)" order="descending"/>
        <!--Month-->
        <xsl:sort select="substring(permitExpiry,9,2)" order="descending"/>
        <!--Day-->
        <xsl:sort select="substring(permitExpiry,12,2)" order="descending"/>
        <!--Hour-->
        <xsl:sort select="substring(permitExpiry,15,2)" order="descending"/>
        <!--Minute-->
        <xsl:sort select="substring(permitExpiry,18,2)" order="descending"/>
        <!--Second-->
        <xsl:copy-of select="."/>
     </xsl:for-each>
  </xsl:variable>
  <target>
     <relatedTarget>
        <permitStart>
           <xsl:value-of select="$temp//permitStart[1]"/>
        </permitStart>
        <permitExpiry>
           <xsl:value-of select="$temp1/permitExpiry[1]"/>
        </permitExpiry>
     </relatedTarget>
  </target>
 </xsl:template>
 </xsl:stylesheet>

输出:

<target>
<relatedTarget>
  <permitStart>2014-07-01T09:22:00.000Z</permitStart>
  <permitExpiry>2003-07-12T08:11:00.000Z</permitExpiry>
</relatedTarget>
</target>

更简化的版本:

<xsl:stylesheet exclude-result-prefixes="xs" version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="target">
  <xsl:variable name="permitStartVar" select="//permitStart"/>
  <xsl:variable name="permitStopVar" select="//permitExpiry"/>

  <xsl:variable name="temp">
     <xsl:for-each select="relatedTarget/permitStart">
        <xsl:sort select="."/>
        <xsl:copy-of select="."/>
     </xsl:for-each>
  </xsl:variable>
  <xsl:variable name="temp1">
     <xsl:for-each select="relatedTarget/permitExpiry">
        <xsl:sort select="."  order="descending"/>
        <xsl:copy-of select="."/>
     </xsl:for-each>
  </xsl:variable>
  <target>
     <relatedTarget>
        <permitStart>
           <xsl:value-of select="$temp//permitStart[1]"/>
        </permitStart>
        <permitExpiry>
           <xsl:value-of select="$temp1/permitExpiry[1]"/>
        </permitExpiry>
     </relatedTarget>
  </target>
</xsl:template>
</xsl:stylesheet>

这篇关于按xslt排序并选择最小值或最大值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆