2011-05-12 85 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