如何对元素进行排序并将其存储在变量XSLT中
我想知道是否可以先对一些元素进行排序,然后将它们(已经排序)存储在一个变量中。我需要引用XSLT,这就是为什么我想将它们存储在变量中 我试着做下面的事情,但似乎不起作用如何对元素进行排序并将其存储在变量XSLT中,xslt,date,sorting,variables,store,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="/BookingCosti
<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
变量中。这样以后,我就可以使用$depositions[1]
访问它们了
我将感谢任何帮助和提示
非常感谢 猜测(手头没有开发环境):
加
在结束之前,首先,在变量声明中,您确实需要做一些事情来创建新节点。严格地说,您不是在对它们进行排序,而是按照给定的顺序阅读它们。我认为您需要添加某种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 one
<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" />
下面是一篇关于节点集的好文章
XSLT 2.0版
可以使用执行排序
,并使用as关键字
(as=“element(multidepositions)+
”)来判断变量的类型为多存款序列<?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>
<?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
Tim是对的,在for-each中,如果要填充变量,则需要输出一些内容,所以在for-each中使用该变量。然而,变量的类型不是节点集,而是结果树片段。只有通过对变量调用扩展函数,结果树片段才会转换为可以应用XPath的节点集。谢谢大家!是的,我确实需要。蒂姆:谢谢你的文章,它很有帮助。Martin,你知道有没有机会好好阅读一下树片段,以及不同的函数是如何作用于一个文档的?或者关于XSLT的一般信息?我真的很感激。你的问题表明你可能试图在更大范围内以错误的方式解决问题。为什么要将已排序的节点集存储在变量中?你到底想干什么?(“我想以
$depositions[1]
”的形式访问它们并不是我想要的答案。)Tomalak,不幸的是,我使用的是结构糟糕的XML。必须按顺序列出一些位置,并且在结果文件的不同部分也需要这些位置。没有属性来决定存款顺序,我决定不依赖于这个位置。这就是我决定对它们进行分类和存储的原因,这样我就可以在需要的时候轻松地引用所有特定的文件。希望这有道理?是的,有道理。有时候就是这样。想一想中间转换,合理地重新构造不良输入,然后在此基础上构建最终转换吗?从长远来看可能是值得的。谢谢你,帕特里克。我假设在XSLT1.0中不可能使用as=“element(multidepositions)+”?不幸的是,我没有yyyy-mm-dd格式的日期。我在子字符串函数之前的每个sort语句中使用函数。我提到它并不是为了简化代码。我尝试在sort语句之前使用一个局部变量,将整个日期转换为yyyy-mm-dd,但显然sort指令必须是第一个。所以是的。谢谢您的回复:)不幸的是,没有,它只是2.0版本。@Patrick,如果它有名称空间呢。我得到变量$xx是元素(Q{}yy)的值的必需项类型;提供的值具有项目类型元素(Q{http://www.w3.org/1999/xhtml}yy)
。