2012-03-22 4 views
7

У меня довольно большой XSL-документ для задания, которое выполняет ряд вещей. Он почти завершен, но я пропустил требование, чтобы его сортировали, и я не могу заставить его работать. Здесь есть SSCCE того, что происходит.xsl: sort with apply-templates not sorting

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

<!-- Root Document --> 
<xsl:template match="/"> 

    <html> 
    <body> 

     <xsl:apply-templates select="staff"> 
      <xsl:sort select="member/last_name" /> 
     </xsl:apply-templates> 

    </body> 
    </html> 

</xsl:template> 

<xsl:template match="member"> 
    <xsl:value-of select="first_name" />&#160;<xsl:value-of select="last_name" /> <br/> 
</xsl:template> 

</xsl:stylesheet> 

XML-файл выглядит следующим образом

<?xml version="1.0" encoding="UTF-8"?> 

<?xml-stylesheet type="text/xsl" href="sort.xsl"?> 

<staff> 
    <member> 
     <first_name>Joe</first_name> 
     <last_name>Blogs</last_name> 
    </member> 

    <member> 
     <first_name>John</first_name> 
     <last_name>Smith</last_name> 
    </member> 

    <member> 
     <first_name>Steven</first_name> 
     <last_name>Adams</last_name> 
    </member> 

</staff> 

Я ожидал, что сотрудники должны быть перечислены по фамилиям, но они не получают отсортированы. Пожалуйста, имейте в виду, что я очень неопытен в XSLT.

ответ

20
<xsl:apply-templates select="staff"> 
     <xsl:sort select="member/last_name" /> 
    </xsl:apply-templates> 

выбирает элементы персонала и сортирует их, но есть только один элемент персонала, поэтому это не-op.

Изменения в

<xsl:apply-templates select="staff/member"> 
     <xsl:sort select="last_name" /> 
    </xsl:apply-templates> 

то, что выбирает все элементы членов и сортирует их.

3

что отсутствует шаблон соответствия персонала или изменить шаблон соответствия для элемента, как и в этом одна:

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

<!-- Root Document --> 
<xsl:template match="/"> 

    <html> 
    <body> 

     <xsl:apply-templates select="staff/member"> 
      <xsl:sort select="last_name" /> 
     </xsl:apply-templates> 

    </body> 
    </html> 

</xsl:template> 

<xsl:template match="member"> 
    <xsl:value-of select="first_name" />&#160;<xsl:value-of select="last_name" /> <br/> 
</xsl:template> 

</xsl:stylesheet>