2011-05-12 35 views
5

在foreach循环结合我想使用前同辈::XSLT排序与前同辈::

<for-each..> 
    <xsl:sort select="type"/> 
    <xsl:when test="preceding-sibling::data[1]/type != type 

的问题是,在foreach内“类型”与未分选的preceding-相比兄弟姐妹 例如

data1/type = 1 
data2/type = 2 
data3/type = 1 

将比较在第二回路silbling = 2(原始未排序)和类型= 1(因为它被排序)

是有围绕它的方法吗?

UPDATE:我的本意是以下

before    after 
data/type2   type1 value1 
data/type1   type1 value2 
data/type1   and speaking in HTML a spacer here (I compare type2:value to preceding-sibling value 
data/type2   type2 value1 
        type2 value2 

我有哪里类型是一个小镇地址的未排序的,我需要通过镇,做一些东西,取决于价值观和排序的HTML表其他领域(该部分正在工作,但由于与前兄弟姐妹的比较没有在每个排序的工作,我得到了问题

回答

1

您是否试图按类型对数据元素进行分组?让我们知道你在做什么,我们可以帮忙(正如迈克尔凯说的)。

一个选项(在XSLT 2.0或节点集扩展中)是将数据元素分类复制到一个新变量,然后在该变量的节点集上运行xsl:for-each。那么前面的兄弟关系将反映排序的顺序。

+0

我想按数据/类型对节点进行排序,然后使用它。我将如何制作该节点的分类副本? – 2011-05-13 06:33:19

1

节点彼此之间的关系 - 父母,孩子,兄弟姐妹等,不会因排序而改变,您可以按照出生日期顺序查看员工,但他们的父母,子女和兄弟姐妹仍然与第ey在原始树中执行 - 因为它们仍然是原始树中的节点。

所以你说过你想如何解决你的问题,它不会工作。下一步是告诉我们问题是什么。

+0

这并不提供答案的问题。要批评或要求作者澄清,请在其帖子下方留言。 – Dijkgraaf 2015-10-04 23:55:13

+0

我会声称“你的问题是不连贯的,这就是为什么”是一个答案。这不是OP问题的解决方案,但它是他们问题的答案。 – 2015-10-05 13:12:00

0

自认为具有同等的排序关键字的元素将出现在文档顺序XSLT的保证,可以更换

<xsl:when test="preceding-sibling::data[1]/type != type"> 

<xsl:when test="not(preceding::data/type = type)"> 

检查,如果当前节点是在文档中的第一个节点(因此,在有序集合中)与其类型。 (请注意,我用的preceding代替preceding-sibling,因为我不知道,如果你的所有数据元素会在原始文档中的兄弟姐妹。)

如果性能是一个问题,你也可以使用xsl:key。另一种解决方案是分组(使用XSLT 1.0中的Muenchian分组和XSLT 2.0中的xsl:for-each-group)。

+0

更换不适合我。第一组按预期方式生成(''),但其余组重复(''而不是预期的'')。 – 2013-06-26 07:27:36

4

这个解决方案现在工作对我来说:

<xsl:variable name="sortedcopy"> 
     <xsl:for-each select="node1/node2/node3/data"> 
     <xsl:sort select="type" order="ascending"/> 
     <xsl:copy-of select="current()"/> 
     </xsl:for-each> 
    </xsl:variable> 
    <xsl:variable name="relItems" select="MSXML:node-set($sortedcopy)" /> 
    <xsl:for-each select="$relItems/data"> 
     <xsl:if test="not(preceding-sibling::data[1]/id = id)"> 
     <hr/> 
     </xsl:if> 
     <xsl:value-of select="val"/> 
    </xsl:for-each> 
+0

很高兴建议帮助。我确实认为,正如每位答复者所指出的,如果您使用推荐的分组功能,例如Meunchian,您会获得更好的性能。 – LarsH 2011-05-13 20:20:22

+0

[node-set()](https://msdn.microsoft.com/zh-cn/library/hz88kef0%28v=vs.110%29.aspx)是专有功能,不属于[XSL 1.0标准](http://www.w3.org/TR/xslt),所以这不会是可移植的。 – vallismortis 2015-10-02 20:18:29