如何对元素进行排序并将它们存储在变量XSLT中

时间:2010-02-16 10:31:36

标签: xslt date sorting variables store

我想知道是否可以先对某些元素进行排序并将它们(已经排序)存储在变量中。我需要引用他们的想法XSLT,这就是我想将它们存储在变量中的原因。

我试图执行以下操作,但似乎无法正常工作

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

<xsl:variable name="deposits">
  <xsl:for-each select="/BookingCostings/MultiDeposits">
    <xsl:sort select="substring(@DepositDate, 1, 4)" />
    <xsl:sort select="substring(@DepositDate, 6, 2)" />
    <xsl:sort select="substring(@DepositDate, 9, 2)" />
 </xsl:for-each>
</xsl:variable>

我试图按照{yyyy-mm-dd'格式按@DepositDate对元素进行排序,并将它们全部存储在$deposits变量中。以后,我可以使用$deposits[1]访问它们。

我将不胜感激任何帮助和提示!

非常感谢!

3 个答案:

答案 0 :(得分:4)

  1. 使用XSLT version 2.0,您可以使用perform-sort并使用MultiDepositsas keyword“)告诉您的变量属于as="element(MultiDeposits)+序列的类型< / LI>
  2. 由于您的数据已经是yyyy-mm-dd,因此您可以避免使用子字符串获取日期的每个部分并直接在字段上使用排序
  3. 使用此示例xml:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <BookingCostings>
      <MultiDeposits depositDate="2001-10-09">1</MultiDeposits>
      <MultiDeposits depositDate="1999-10-09">2</MultiDeposits>
      <MultiDeposits depositDate="2010-08-09">3</MultiDeposits>
      <MultiDeposits depositDate="2010-07-09">4</MultiDeposits>
      <MultiDeposits depositDate="1998-01-01">5</MultiDeposits>
    </BookingCostings>
    

    并使用XSLT 2.0版表:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
     <xsl:template match="/">
     <html>
      <body>
    
      <xsl:variable name="deposits" as="element(MultiDeposits)+">
       <xsl:perform-sort select="BookingCostings/MultiDeposits">
        <xsl:sort select="@depositDate"/>
       </xsl:perform-sort>
      </xsl:variable>
    
      first date:<xsl:value-of select="$deposits[1]/@depositDate"/>,
      last date:<xsl:value-of select="$deposits[last()]/@depositDate"/>
    
      </body>
     </html>
     </xsl:template>
    
    </xsl:stylesheet>
    

    输出将是:

    first date:1998-01-01, last date:2010-08-09
    

答案 1 :(得分:3)

首先,在变量声明中,您需要做一些事情来创建新节点。严格地说,你不是在对它们进行排序,而只是按照给定的顺序读取它们。我认为你需要添加某种xsl:copy命令。

<xsl:variable name="deposits"> 
  <xsl:for-each select="/BookingCostings/MultiDeposits"> 
    <xsl:sort select="substring(@DepositDate, 1, 4)" /> 
    <xsl:sort select="substring(@DepositDate, 6, 2)" /> 
    <xsl:sort select="substring(@DepositDate, 9, 2)" /> 
    <xsl:copy-of select=".|@*" />
 </xsl:for-each> 
</xsl:variable> 

这会创建一个'node-set',但要访问它,您需要在XSLT中使用扩展函数。您使用哪一个取决于您使用的XSLT处理器。在我即将给出的示例中,我使用的是Microsoft。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt" version="1.0"> 

然后,要访问变量中的节点,您可以执行类似这样的操作

<xsl:value-of select="ms:node-set($deposits)/MultiDeposits[1]/@DepositDate" />

这是一篇阅读节点集

的好文章

Xml.com article on Node-Sets

答案 2 :(得分:0)

猜猜(没有开发环境):

添加 <xsl:value-of select="." />

在结束前</xsl:for-each>