2014-04-21 46 views
4

我想改變輸出元素的順序。它當前顯示爲:「數學:英語:科學:ABA(GCSE);(GCSE);(GCSE) ;」 我需要一種排序方式,以便我可以像這樣顯示: 「數學:A(GCSE);英語:B(GCSE);科學:A(GCSE);」 我是XML的新手,所以請儘量不要顯示任何過於複雜的解決方案!XML - 不按要求順序輸出的元素

XSL代碼:

<xsl:template match="education"> 
<div style="float:left;"> 
    <xsl:apply-templates select="qualifications/qual"/> 
    <xsl:apply-templates select="qualifications/grade"/> 
    <xsl:apply-templates select="qualifications/level"/> 
</div> 
</xsl:template> 

<xsl:template match="qual"><span style="color:grey; font-size:15px; font-family:verdana;">   
<xsl:value-of select="."/></span><p1>:</p1></xsl:template> 
<xsl:template match="grade"><span style="color:grey; font-size:15px; font-family:verdana;"><xsl:value-of select="."/></span><p1> </p1></xsl:template> 
<xsl:template match="level"><p1> (</p1><span style="color:grey; font-size:15px; font-family:verdana;"><xsl:value-of select="."/></span><p1>);</p1></xsl:template> 

XML代碼:

<qualifications> 
      <qual>Mathematics</qual>      <grade>A</grade> <level>GCSE</level> 
      <qual>English</qual>       <grade>B</grade> <level>GCSE</level> 
      <qual>Science</qual>       <grade>A</grade> <level>GCSE</level> 
</qualifications> 

回答

3

你第一次應用模板到所有qual孩子,那麼每個grade,那麼每個level,準確地得到輸出你應該期待這一點。相反,簡單地處理爲了孩子你education模板中:

<xsl:template match="education"> 
    <div style="float:left;"> 
     <xsl:apply-templates select="qualifications/*" /> 
    </div> 
</xsl:template> 

這適用模板文件順序qualifications所有兒童(即它們在文檔中出現的順序)。沒有必要循環或選擇特定的兄弟姐妹。讓XSLT處理器爲您做好工作。

+0

我可以高興地報告說,這種方法也適用;和(如你所說)使用更少的代碼,因爲XSLT處理器正在處理它。謝謝你的幫助! – SixTailedFox

1

這應該做的。循環每個QUAL,存放在變量位置和順序應用模板元素:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="education"> 
    <div style="float:left;"> 
     <xsl:for-each select="qualifications/qual"> 
      <xsl:variable name="pos" select="position()"/> 
      <xsl:apply-templates select="../qual[$pos]"/> 
      <xsl:apply-templates select="../grade[$pos]"/> 
      <xsl:apply-templates select="../level[$pos]"/> 
     </xsl:for-each> 
    </div> 
</xsl:template> 

<xsl:template match="qual"><span style="color:grey; font-size:15px; font-family:verdana;">   
<xsl:value-of select="."/></span><p1>:</p1></xsl:template> 
<xsl:template match="grade"><span style="color:grey; font-size:15px; font-family:verdana;"><xsl:value-of select="."/></span><p1> </p1></xsl:template> 
<xsl:template match="level"><p1> (</p1><span style="color:grey; font-size:15px; font-family:verdana;"><xsl:value-of select="."/></span><p1>);</p1></xsl:template> 

</xsl:stylesheet> 
+0

非常感謝(特別是對於快速反應!) - 此方法的作品。感謝您解釋它是如何工作的。 – SixTailedFox

+1

請注意,在XSLT中使用'for-each'很少必要,並且這種情況並非真正推薦。 XSLT處理器*已經*以文檔順序訪問元素。你不需要明確地做。 –

+0

@lwburk,不錯..其真的很簡單:) –