Sort XML nodes in alphabetical order using XSL

狂风中的少年 提交于 2019-11-27 07:17:25

问题


I am trying to figure out how to sort the XML list of employees alphabetically by lastname using XSL. Right now it just displays the XML information in the same order as it is in the XML. I don't think I fully understand how to use the <xsl:sort> function as I am new to XSL. I also tried putting order-by="+ Lastname" in with <xsl:for-each> and I couldn't get that to work either.

Heres my xml:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="Company1.xsl"?>
<Company>
    <Employee>
        <Firstname>John</Firstname>
        <Lastname>Smith</Lastname>
        <ssn>635-35-7463</ssn>
        <doh>February 3, 2011</doh>
        <Age>34</Age>
    </Employee>
    <Employee>
        <Firstname>Brad</Firstname>
        <Lastname>Roberts</Lastname>
        <ssn>789-65-4568</ssn>
        <doh>February 13, 2012</doh>
        <Age>25</Age>
    </Employee>
    <Employee>
        <Firstname>Karen</Firstname>
        <Lastname>Smith</Lastname>
        <ssn>369-12-7415</ssn>
        <doh>March 24, 2011</doh>
        <Age>28</Age>
    </Employee>
    <Employee>
        <Firstname>Eli</Firstname>
        <Lastname>Smith</Lastname>
        <ssn>489-32-8525</ssn>
        <doh>September 14, 2010</doh>
        <Age>38</Age>
    </Employee>
    <Employee>
        <Firstname>Bill</Firstname>
        <Lastname>Joel</Lastname>
        <ssn>689-67-7634</ssn>
        <doh>February 29, 2012</doh>
        <Age>24</Age>
    </Employee>
    <Employee>
        <Firstname>Kelly</Firstname>
        <Lastname>Greene</Lastname>
        <ssn>927-82-6873</ssn>
        <doh>December 3, 2010</doh>
        <Age>34</Age>
    </Employee>
</Company>

And heres my XSL:

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

    <xsl:template match="/">
    <HTML>
    <HEAD>
    <TITLE>Company Employees</TITLE> 
    </HEAD>
    <BODY>
    <H2>Company Employees</H2> 

    <xsl:for-each select="Company/Employee">
        <xsl:sort select="Employee/Lastname" data-type="text" order="ascending"/>
        <xsl:sort select="Employee/Firstname" data-type="text" order="ascending"/>

        <SPAN STYLE="font-weight:bold">FirstName: </SPAN>
            <xsl:value-of select="Lastname" />
        <BR />
        <SPAN STYLE="font-weight:bold">LastName: </SPAN>
            <xsl:value-of select="Firstname" />
        <BR /> 
        <SPAN STYLE="font-weight:bold">SSN: </SPAN> 
        <xsl:value-of select="ssn" /> 
        <BR /> 
        <SPAN STYLE="font-weight:bold">Date of Hire: </SPAN> 
        <xsl:value-of select="doh" /> 
        <BR /> 
        <SPAN STYLE="font-weight:bold">Age: </SPAN> 
        <xsl:value-of select="Age" /> 
        <P/>
    </xsl:for-each>
    </BODY>
    </HTML>
    </xsl:template>
</xsl:stylesheet>

回答1:


At a glance,

    <xsl:sort select="Employee/Lastname" data-type="text" order="ascending"/>
    <xsl:sort select="Employee/Firstname" data-type="text" order="ascending"/>

should be

    <xsl:sort select="Lastname" data-type="text" order="ascending"/>
    <xsl:sort select="Firstname" data-type="text" order="ascending"/>

for-each sets the context node for the select, so the expression is evaluated against the Employee nodes.

Also, text and ascending are defaults, so you could just write

    <xsl:sort select="Lastname"/>
    <xsl:sort select="Firstname"/>


来源:https://stackoverflow.com/questions/9815479/sort-xml-nodes-in-alphabetical-order-using-xsl

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!