使用XSL按字母顺序对XML节点进行排序

问题描述:

我试图弄清楚如何使用XSL按姓氏的字母顺序对员工的XML列表进行排序.现在,它只是按照与XML中相同的顺序显示XML信息.我不完全了解如何使用<xsl:sort>函数,因为我是XSL的新手.我还尝试将order-by="+ Lastname"<xsl:for-each>一起放入,但我也无法正常工作.

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.

这里是我的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>

这是我的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>

一目了然

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

应该是

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

for-each设置select的上下文节点,因此将根据Employee节点对表达式进行求值.

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

此外,textascending是默认设置,因此您可以编写

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

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