2012-03-22 200 views
2

我想弄清楚如何使用XSL按字母排序员工的XML列表。现在它只是以与XML中相同的顺序显示XML信息。我不认为我完全理解如何使用<xsl:sort>函数,因为我是XSL的新手。我也尝试将与<xsl:for-each>放在一起,我也无法让它工作。使用XSL按字母顺序排序XML节点

继承人我的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> 

回答

7

一目了然,

<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节点进行评估。

此外,textascending是默认的,所以你可以只写

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

这做到了!很高兴这很简单。感谢您的快速响应。 – Jmh2013 2012-03-22 02:19:27

+0

@ Fourthmeal70,很高兴我能帮上忙。坦率地说,我甚至都不知道你可以用XSLT做多种类型,所以我也学到了一些东西。为了在将来的问题中获得最佳结果,您应该将正确答案标记为“已接受”(复选标记)。 – harpo 2012-03-22 02:34:36