Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何对元素进行排序并将其存储在变量XSLT中_Xslt_Date_Sorting_Variables_Store - Fatal编程技术网

如何对元素进行排序并将其存储在变量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

我想知道是否可以先对一些元素进行排序,然后将它们(已经排序)存储在一个变量中。我需要引用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
变量中。这样以后,我就可以使用
$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)+
    ”)来判断变量的类型为多存款序列
  • 由于您的数据已经是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>
    
    <?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)