2012-03-08 42 views
1

比方說,我們有一些項目它們要麼水果或衣服:如何從節點的組中不改變順序?

<items> 
    <orange/> 
    <banana/> 
    <apple/> 
    <jacket/> 
    <shirt/> 
    <trousers/> 
    <apple/> 
    <banana/> 
    <jacket/> 
    <apple/> 
    <banana/> 
</items> 

而且我想他們進行分組如下方式在不改變項目的順序:

<items> 
    <fruits> 
     <orange/> 
     <banana/> 
     <apple/> 
    </fruits> 
    <clothes> 
     <jacket/> 
     <shirt/> 
     <trousers/> 
    </clothes> 
    <fruits> 
     <apple/> 
     <banana/> 
    </fruits> 
    <clothes> 
     <jacket/> 
    </clothes> 
    <fruits> 
     <apple/> 
     <banana/> 
    </fruits> 
</items> 

我是初學者談到XSLT,瀏覽了無數的例子後,我仍然無法知道如何實現使用XSLT。

+1

你能解釋一下你爲什麼要這麼做?也許你試圖解決的問題比這種分組有更好的解決方案。 – 2012-03-08 23:16:59

+0

@JimGarrison,我能想到的一個原因是,對於其他**用戶來說,它更易於閱讀。有人不知道_jacket_是屬於布類還是水果類)(好吧,例子可以升級爲普通人的一些未知的東西,例如分組化學品?) – 2012-03-09 05:00:07

+0

@JimGarrison和MtP,這個分組可以通過將所有水果分組在一個區塊中以及將所有的衣物分組在其他區域中來更簡單。但是,很好。我認爲這可能是用戶不想混淆的信息包。 – 2012-03-09 05:05:43

回答

3

任何一種分組在XSLT2比XSLT1容易,所以我會假設XSLT2因爲你沒有說

<xsl:stylesheet version="2.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:f="data:f" 
     exclude-result-prefixes="f"> 

<xsl:output indent="yes"/> 

<xsl:template match="items"> 
<xsl:for-each-group select="*" 
      group-adjacent="f:type(.)"> 
    <xsl:element name="{current-grouping-key()}"> 
    <xsl:copy-of select="current-group()"/> 
    </xsl:element> 
</xsl:for-each-group> 
</xsl:template> 

<xsl:function name="f:type"> 
<xsl:param name="n"/> 
<xsl:apply-templates mode="type" select="$n"/> 
</xsl:function> 

<xsl:template mode="type" match="orange|banana|apple">fruits</xsl:template> 

<xsl:template mode="type" match="shirt|trousers|jacket">clothes</xsl:template> 

<xsl:template mode="type" match="*">x</xsl:template> 

</xsl:stylesheet> 
+0

我不會想到使用apply-templates來實現用戶定義的函數。 – LarsH 2012-03-08 23:29:37

+0

XSLT2比XSLT1更容易分組。同意..! – 2012-03-09 04:47:42