3

我想知道是否可以先对一些元素进行排序并将它们(已经排序)存储在一个变量中。我需要参考他们认为 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>

我试图以@DepositDate“yyyy-mm-dd”格式对元素进行排序,并将它们全部存储在$deposits变量中。这样以后,我就可以使用$deposits[1].

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

非常感谢!

4

3 回答 3

5
  1. 使用XSLT version 2.0您可以使用perform-sort并告诉您的变量是MultiDeposits使用as keyword( as="element(MultiDeposits)+")的序列的类型
  2. 由于您的数据已经是 yyyy-mm-dd 您可以避免使用子字符串来获取日期的每个部分并直接在字段上使用排序

使用此示例 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
于 2010-02-16T15:34:24.050 回答
4

首先,在您的变量声明中,您确实需要做一些事情来创建新节点。严格来说,您不是对它们进行排序,而只是按照给定的顺序阅读它们。我认为您需要添加某种 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> 

这会创建一个“节点集”,但要访问它,您需要使用 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 关于节点集的文章

于 2010-02-16T11:36:04.897 回答
-1

猜猜(手头没有开发环境):

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

收盘前</xsl:for-each>

于 2010-02-16T10:37:58.980 回答