2011-04-27 35 views
1

親愛的社區, 各個元素,我想變換具有這種格式的XML初始:XSLT:如何分類分別位於同一水平

<h2>title1</h2> 
<div>sometext1</div> 
<div>sometext2</div> 
<h2>title2</h2> 
<div>sometext3</div> 
<div>sometext4</div> 
<h2>title3</h2> 
<div>sometext5</div> 
<div>sometext6</div> 

<cat name="title1"> 
<div>sometext1</div> 
<div>sometext2</div> 
</cat> 
<cat name="title2"> 
<div>sometext3</div> 
<div>sometext4</div> 
</cat> 
<cat name="title3"> 
<div>sometext5</div> 
<div>sometext6</div> 
</cat> 

我試圖執行double for-each並創建一個變量來保存「select」選項來執行inner for-each,但似乎需要使用node-set()函數。即使我嘗試包含它,它也不起作用。你有沒有想過如何解決這個問題,使用XSLT 1.0,最好不使用任何其他名稱空間?

+0

向我們展示您的變換 – ThomasRS 2011-04-27 16:20:16

+0

[使用XSLT合併相鄰兄弟節點]的可能副本(http://stackoverflow.com/questions/2091951/merge-adjacent-sibling-nodes-with-xslt) – 2011-04-27 17:10:59

回答

0

以下是一種不依賴於嵌套循環的方法。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:key name="x" match="div" use="preceding-sibling::h2[1]"/> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()[not(name()='div')]"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="h2"> 
    <cat name="{text()}"> 
     <xsl:apply-templates select="key('x',.)"/> 
    </cat> 
    </xsl:template> 

</xsl:stylesheet> 

它首先建立一個索引(xsl:key),它將每個div映射到緊鄰的前一個h2。然後我們有一個簡單的標識轉換,可以跳過div條目。對於遇到的每個h2,我們生成<cat>,然後輸出從該h2索引的<div...>標籤。