Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.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
Xml 根据xslt 1.0中for each循环的排序函数计算节点数_Xml_Xslt_Xslt 1.0 - Fatal编程技术网

Xml 根据xslt 1.0中for each循环的排序函数计算节点数

Xml 根据xslt 1.0中for each循环的排序函数计算节点数,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,输入xml具有以下层次结构 <a> <b> <b1>3</b1> <c> <d> <d1>13</d1> <d2>text1</d2> </d> <d> <d1>14</d1> <d2>text2</d2> </d&g

输入xml具有以下层次结构

<a>  
 <b>
  <b1>3</b1> 
  <c> 
    <d>
    <d1>13</d1>
    <d2>text1</d2> 
    </d>
    <d>
    <d1>14</d1>
    <d2>text2</d2>
    </d>   
    <d>
    <d1>12</d1>
    <d2>text3</d2> 
    </d>
  </c>  
 </b>  
 <b>
  <b1>2</b1> 
  <c>  
    <d> 
    <d1>11</d1>
    <d2>text5</d2>
    </d>
    <d>
    <d1>10</d1>
    <d2>text4</d2>
    </d>
  </c>  
 </b> 
  ---- and so on.
</a>

3.
13
文本1
14
文本2
12
文本3
2.
11
文本5
10
文本4
----等等。
我有一个xsl模板,其中一部分看起来像

    <xsl:for-each select="a/b">
    <xsl:sort select="b1" data-type="number"/>
    ----- other mapping---
     <xsl:for-each select="c/d">
     <xsl:sort select="d1" data-type="number"/>
       <xsl:variable name="cnt">
       <xsl:value-of select="count(preceding::../../c/d)"/>
      </xsl:variable>
     ------ other mapping------
     </xsl:for-each>
    </xsl:for-each>

-----其他映射---
------其他映射------
现在,即使应用了sort函数,count函数也遵循输入xml中的“d”顺序,而不是基于for each语句中“d”的升序排序。
对于元素b的循环2中的eg,即b[position()=2],我得到了cnt=3,尽管它应该是2。请注意。

前面的::axis只按文档顺序查看节点-它们在输入中的实际顺序。它不考虑任何类似于当前序列或当前排序顺序的内容

如果您确实想按排序顺序计算当前in之前有多少个
元素,那么您可以这样做,因为它之前的每个元素的排序键值都应该低于当前元素的值:

<xsl:variable name="d1" select="number(d1)" />
<xsl:value-of select="count(../d[number(d1) &lt; $d1])" />
<xsl:for-each select="a/b">
    <xsl:sort select="b1" data-type="number" />
    ----- other mapping---
    <xsl:for-each select="c/d">
        <xsl:sort select="d1" data-type="number" />
        <xsl:variable name="cnt">
            <xsl:value-of select="position() - 1" />
        </xsl:variable>
        ------ other mapping------
    </xsl:for-each>
</xsl:for-each>
这来自xslt 1.1规范,它比xslt 1.0规范更好地描述了它,但在xslt 1.0中也是如此:

[上下文位置是上下文项目在 当前正在处理的项目的序列。每当 上下文项更改。当指令(如xsl:apply-templates)更改时 或xsl:for each用于处理一系列项,第一项 在序列中,上下文位置为1,第二个 上下文位置为2的项,依此类推。]上下文位置为 由XPath表达式
position()
返回

从进一步的注释来看,似乎需要一个数字,该数字表示当前节点在两个for循环中的总体顺序,即for循环的排序顺序


您可以使用我的第一种方法:通过使用“我看到您正在为每个节点使用外部
中的
position()
来比较值,按排序顺序计算在此节点之前的节点。你不把它用在内心世界有什么原因吗?你到底想数什么?我必须在目标xml中生成两个序列号。第一个序列是外循环的位置,第二个序列是前一个
xxplpediasnobderlpn
循环中
xxplpediasnobderlpndet
节点总数和内循环的位置之和。我希望我说得很清楚。不要让人们很难帮助你。为元素名称(如
xxplpediansonborderlpndetcollection
)找到好的(简短的!)替换项,因为它们对于解释并不重要。
前面的:../../c/d
无效。如果您想在这个元素之前获得
d
元素的数量,那么只需使用
previous::d
,如果您想在这个元素包含
b
之前获得
d
元素的数量,那么使用
。/../previous::d
位置()函数仅返回当前
循环中
元素的计数。我想在前面的
循环中计算它。我已经用一个解决方案扩展了我的答案,我认为你的问题是什么意思。谢谢欧文,这正是我想要得到的
的第二个循环中的位置,在
的前一个循环(包括排序)中的
数量的延续。
<xsl:for-each select="a/b">
    <xsl:sort select="b1" data-type="number" />
    ----- other mapping---
    <xsl:for-each select="c/d">
        <xsl:sort select="d1" data-type="number" />
        <xsl:variable name="me" select="." />
        <xsl:variable name="cnt">
            <xsl:value-of select="count(../d[number(d1) &lt; number($me/d1)]) + count(../../../b/c/d[number(../../b1) &lt; number($me/../../b1)])" />
        </xsl:variable>
        ------ other mapping------
    </xsl:for-each>
</xsl:for-each>