我想知道是否可以先对某些元素进行排序并将它们(已经排序)存储在变量中。我需要引用他们的想法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]
访问它们。
我将不胜感激任何帮助和提示!
非常感谢!
答案 0 :(得分:4)
XSLT version 2.0
,您可以使用perform-sort
并使用MultiDeposits
(as keyword
“)告诉您的变量属于as="element(MultiDeposits)+
序列的类型< / LI>
使用此示例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" />
这是一篇阅读节点集
的好文章答案 2 :(得分:0)
猜猜(没有开发环境):
添加
<xsl:value-of select="." />
在结束前</xsl:for-each>