2012-12-06 57 views
4

通過將元素XSLT分組來解決問題面臨困難。 我必須使用xsl:鍵嗎?如果是這樣,怎麼辦 或更多xsl:for-each? 這是我的問題。我的XML文件:如何對XSLT中的元素進行分組

<page> 
<name>test</name> 
<property id="416" name="country" type="relation"> 
    <title>Country</title> 
     <value> 
      <item id="1014" name="Canada"/> 
     </value> 
    </property> 
</page> 

和物品,件20,每個人都有一個名字(非經常性,和自己的國家,可以重複) 如何推演國家分類這樣的元素? 例如:

<h1>Canada</h1> 
<h2>test<h2> 
<h2>test2<h2> 

<h1>England</h1> 
<h2>test3</h2> 
<h2>test3</h2> 

UPDATE:

<page id="423" parentId="421" link="/producers/oao_nii_elpa/" is-active="1" object-id="1020" type-id="67" type-guid="catalog-category" update-time="1350295423" alt-name="oao_nii_elpa"> 
<basetype id="44" module="catalog" method="category">Catalog category</basetype> 
<name>Nii elpa</name> 
<properties> 
<group id="130" name="common"> 
<title>Params</title> 
<property id="116" name="h1" type="string"> 
<title>H1 field</title> 
<value>Nii elpa</value> 
</property> 
</group> 
<group id="131" name="menu_view"> 
<title>Menu View</title> 
<property id="123" name="header_pic" type="img_file"> 
<title>Header_Pic</title> 
<value path="./images/cms/headers/elpa.jpg" folder="/images/cms/headers" name="elpa" ext="jpg" width="139" height="63">/images/cms/headers/elpa.jpg</value> 
</property> 
</group> 
<group id="133" name="additional"> 
<title>Additional</title> 
<property id="416" name="country" type="relation"> 
<title>Country</title> 
<value> 
<item id="3" guid="a1e3ae17e80ba2b4a3ddb1b855430346f74b8d48" name="England" type-id="4" type-guid="d69b923df6140a16aefc89546a384e0493641fbe" ownerId="42" xlink:href="uobject://3"/> 
</value> 
</property> 
</group> 
</properties> 
</page> 
+0

XSLT 1.0或2.0? 2.0的分組更容易。 –

+0

這是*不是*你的XML文件 - 「英格蘭」根本沒有被引用。請告訴我們實際的XML輸入。 – ABach

+0

它是XSLT 1.0。 –

回答

2

對於XSLT 1.0到組的方式由muenchian方法進行,例如:
(來源:http://www.jenitennison.com/xslt/grouping/muenchian.html

我們有一個XML:

<records> 
    <contact id="0001"> 
     <title>Mr</title> 
     <forename>John</forename> 
     <surname>Smith</surname> 
    </contact> 
    <contact id="0002"> 
     <title>Dr</title> 
     <forename>Amy</forename> 
     <surname>Jones</surname> 
    </contact> 
    ... 
</records> 

我們wan't到組按姓氏,併產生以下的輸出:

Jones,<br /> 
    Amy (Dr)<br /> 
    Brian (Mr)<br /> 
Smith,<br /> 
    Fiona (Ms)<br /> 
    John (Mr)<br /> 

這是由以下XSLT 1.0模板完成和重點:

<xsl:key name="contacts-by-surname" match="contact" use="surname" /> 
<xsl:template match="records"> 
    <xsl:for-each select="contact[count(. | key('contacts-by-surname', surname)[1]) = 1]"> 
     <xsl:sort select="surname" /> 
     <xsl:value-of select="surname" />,<br /> 
     <xsl:for-each select="key('contacts-by-surname', surname)"> 
      <xsl:sort select="forename" /> 
      <xsl:value-of select="forename" /> (<xsl:value-of select="title" />)<br /> 
     </xsl:for-each> 
    </xsl:for-each> 
</xsl:template> 

您的問題看起來像模板這種(未經測試):

<xsl:key name="page-by-country" match="page" use="property[@name='country']/value/item/@name" /> 
<xsl:template match="pages"> 
    <xsl:for-each select="page[count(. | key('page-by-country', property[@name='country']/value/item/@name)[1]) = 1]"> 
     <xsl:sort select="property[@name='country']/value/item/@name" /> 
     <h1><xsl:value-of select="property[@name='country']/value/item/@name" /></h1> 
     <xsl:for-each select="key('page-by-country', property[@name='country']/value/item/@name)"> 
      <xsl:sort select="name" /> 
      <h2><xsl:value-of select="name"/></h2> 
     </xsl:for-each> 
    </xsl:for-each> 
</xsl:template> 

見該工作示例您的問題:xsltransform.net

+0

非常感謝!非常有用 –

+0

我更新了工作答案的答案。原來有一些錯別字。看到一個工作示例的鏈接。 – Joep

相關問題