使用XSL按名称对合并的XML元素进行排序

时间:2016-04-06 20:28:46

标签: xml xslt

我的合并文件看起来像这样

    <?xml version="1.0" encoding="UTF-8"?>
<lineup>
   <artists>
      <artist id="124">
         <name>Pascal &amp; Pearce</name>
         <genres>
            <genre>dance</genre>
            <genre>club</genre>
         </genres>
         <writeup>
      After a chance meeting in 2007, Pascal Ellinas and Dave Pearce began the long winding road that is now the stellar production and DJ duo of Pascal &amp; Pearce.
    </writeup>
         <gig>
            <day>SUNDAY</day>
            <time>
               <starts>17:00</starts>
               <ends>19:00</ends>
            </time>
         </gig>
         <photo format="jpg">pascal-pierce</photo>
      </artist>
      <aritst id="101">
         <name>Dan Patlansky</name>
         <genres>
            <genre>Blues</genre>
            <genre>Rock</genre>
            <genre>Jazz</genre>
         </genres>
         <writeup>
      What Dan Patlansky can do with a six-string Fender Stratocaster at the age of 26, most critically acclaimed guitarists will never quite achieve in a lifetime.
    </writeup>
         <gig>
            <day>Friday</day>
            <time>
               <starts>13:00</starts>
               <ends>15:00</ends>
            </time>
         </gig>
         <photo format="jpg">dan-patlansky</photo>
      </aritst>
      etc

我需要按字母顺序对艺术家名称进行排序,这是我到目前为止所做的,但它并没有产生任何东西。这是我的XSL文件。

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

    <xsl:output method="xml" omit-xml-declaration="no" indent="yes" media-type="text/xml" />

    <xsl:template match="/">
        <lineup>
        <artists>
            <xsl:apply-templates select="artists/artist">
                <xsl:sort select="name" order="ascending" />
            </xsl:apply-templates>
        </artists>
        </lineup>
    </xsl:template>

     <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

我的输出生成一个只有标签的空文件。我的合并文件是我的源文件。 非常感谢帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

作为快速解决方法,请将<xsl:apply-templates select="artists/artist">更改为<xsl:apply-templates select="lineup/artists/artist">

匹配

会更简单
<xsl:template match="artists">
  <xsl:copy>
    <xsl:apply-templates select="artist">
      <xsl:sort select="name"/>
    </xsl:apply-templates>
  </xsl:copy>
</xsl:template>