使用XSLT排序

时间:2014-05-21 20:43:44

标签: xslt

我需要按下面的xml排序 / parentList / employeesList / personalInfo /中间名

使用XSLT。我无法生成我期待的格式。中间名称" John"应该出现在输出xml中。你能帮助我吗?以下是我的XML和XSL的

XML:

<parentList>

    <employeesList>
        <personalInfo>
            <middleName>Mike</middleName>
            <lastName>S</lastName>
        </personalInfo>
        <mailingAddress>
            <postalCode>12345</postalCode>
            <cityName>CoEmployee CityName</cityName>
            <state>PA</state>
            <addressLineText>CoEmployee Full Address</addressLineText>
        </mailingAddress>
    </employeesList>
    <employeesList>
        <personalInfo>
            <middleName>John</middleName>
            <lastName>G</lastName>
        </personalInfo>
        <mailingAddress>
            <postalCode>12345</postalCode>
            <cityName>CoEmployee CityName</cityName>
            <state>PA</state>
            <addressLineText>CoEmployee Full Address</addressLineText>
        </mailingAddress>
    </employeesList>
</parentList>

XSL:

                                        

 <xsl:template match="parentList">
    <xsl:copy>
        <xsl:apply-templates>

            <xsl:sort select="/employeesList/personalInfo/middleName" order="ascending"/> 
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>  

2 个答案:

答案 0 :(得分:1)

您需要将排序放在for-each:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
            <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="parentList">
        <xsl:for-each select="employeesList">
            <xsl:sort select="personalInfo/middleName" order="ascending"/>
            <xsl:copy>
                <xsl:apply-templates/>
            </xsl:copy>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

问题出在您在select属性中使用的XPath表达式中。它是一个绝对表达式(以/开头),但你的根元素不是employeesList

当您匹配parentList时,您会将模板应用于其子项,这些子项为sort元素提供上下文。这意味着select sort属性中的相对XPath表达式应位于employeesList的上下文中。

如果您只是将模板更改为此内容,则应该有效:

<xsl:template match="parentList">
    <xsl:copy>
        <xsl:apply-templates>
            <xsl:sort select="personalInfo/middleName" order="ascending"/> 
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>