2013-03-14 24 views
0

在使用1.0的XSLT中是否可能存在無序標記?我最初的猜測並不是,因爲它打破了XML的規則。在XSLT(或分組元素)中使用不按順序的標記

考慮具有X個元素的XML數據,並且我想將這些X個條目拆分爲個別的<div>塊內的3個塊。我會像做的東西這一點,但很明顯,它是完全無效的代碼...

<div> 
    <xsl:for-each select="mydata"> 
    <xsl:value-of select="myvalue"/><br/> 
    <xsl:if test="(position() mod 3)=0"> 
     </div> <!-- This is invalid --> 
     <div> <!-- This is invalid --> 
    </xsl:if> 
    </xsl:for-each> 
</div> 

因此,對於8個元素,示例結果將是

<div> 
    value1<br/> 
    value2<br/> 
    value3<br/> 
</div> 
<div> 
    value4<br/> 
    value5<br/> 
    value6<br/> 
</div> 
<div> 
    value7<br/> 
    value8<br/> 
</div> 

如果以上根本不可能(因爲我懷疑它不是),有人可以建議一種可接受的方式來將它們分組嗎?

(請注意,這必須是一個XSLT 1.0解決方案)

回答

2

你正在試圖做的是可能什麼,但它不是一個好主意。這是一種更好的方法:

<xsl:apply-templates select="mydata[position() mod 3 = 1]" mode="group" /> 

<!-- Separate templates --> 
<xsl:template match="mydata" mode="group"> 
    <div> 
    <xsl:apply-templates select=". | following-sibling::mydata[position() &lt; 3]" /> 
    </div> 
</xsl:template> 

<xsl:template match="mydata"> 
    <xsl:value-of select="myvalue"/><br/> 
</xsl:template> 
+0

太棒了 - 非常感謝JLRishe。並恭喜你的10k :-D – freefaller 2013-03-15 09:30:38

+0

不客氣,並感謝你讓我到那裏。 :) – JLRishe 2013-03-15 13:18:10

2

JLRishe向您顯示解決方案。

你的問題是你正在考慮你的樣式表作爲寫入開始和結束標籤。這不是XSLT所做的:它寫一棵樹。您不能將半個節點寫入結果樹。認爲節點,而不是標籤。

當你遇到類似輸出結構不完全匹配輸入結構的問題時,另一個有用的經驗法則是樣式表的結構應該反映輸出的樹結構,而不是輸入的結構。不要認爲「我應該怎樣處理下一個ABC輸入節點」,而是「我需要在結果樹中生成XYZ節點,我應該如何計算其內容?」。

+0

謝謝Michael ...偉大的建議,我會嘗試改變我對XSLT開發的態度 – freefaller 2013-03-15 09:31:29