XML - 未按所需顺序输出的元素

时间:2014-04-21 16:17:25

标签: xml xslt

我想改变输出元素的顺序。它目前显示如下:“数学:英语:科学:ABA(GCSE);(GCSE);(GCSE);” 我需要一种订购方式,以便我可以这样显示: “数学:A(GCSE);英语:B(GCSE);科学:A(GCSE);” 我是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>

2 个答案:

答案 0 :(得分:3)

您首先将模板应用于所有qual子项,然后是每个grade,然后是每个level,并获得您应该从中获得的输出。相反,只需在education模板中按顺序处理孩子:

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

这会按文档顺序将模板应用于qualifications的所有子项(即它们在文档中出现的顺序)。无需循环或选择特定的兄弟姐妹。让XSLT处理器为您完成工作。

答案 1 :(得分: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>