对XML文件的节点进行排序

时间:2011-04-08 11:30:17

标签: xslt sorting

我是XSLT的新手,虽然到目前为止我已经成功完成了许多任务......排序让我很难过。

我需要一个小例子的帮助,这样我才能理解xsl:排序更好。

我的xml数据如下所示:

<NewTerms>
  <newTerm>Zebra</newTerm>
  <newTerm>Horse</newTerm>
  <newTerm>Cat</newTerm>
  <newTerm>Lion</newTerm>
  <newTerm>Jaguar</newTerm>
  <newTerm>Cheetah</newTerm>
  <newTerm>Deer</newTerm>
  <newTerm>Buffalo</newTerm>
  <newTerm>Dog</newTerm>
</NewTerms>

我只想简单地从xsl表中按字母顺序对它们进行排序。我写的xsl(&amp;不工作)如下:

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

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

  <xsl:template match="NewTerms">

      <xsl:apply-templates>
        <xsl:sort select="newTerm"/>
      </xsl:apply-templates>

  </xsl:template>  

</xsl:stylesheet>

我非常确定我还没有理解xsl:sort函数是怎样的。如果你帮助我完成这个小小的例子......我想我会更好地理解它。

谢谢。

茉莉

2 个答案:

答案 0 :(得分:5)

我假设你想要一个有效的XML结构作为输出,因为在你的<xsl:output>中,方法是“XML”。 你可以试试这个:

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

<xsl:output method="xml" indent="yes" omit-xml-declaration="no" />
<xsl:strip-space elements="*"/>

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

</xsl:stylesheet>

给出了这个输出:

<?xml version="1.0" encoding="UTF-8"?>
<NewTerms>
<newTerm>Buffalo</newTerm>
<newTerm>Cat</newTerm>
<newTerm>Cheetah</newTerm>
<newTerm>Deer</newTerm>
<newTerm>Dog</newTerm>
<newTerm>Horse</newTerm>
<newTerm>Jaguar</newTerm>
<newTerm>Lion</newTerm>
<newTerm>Zebra</newTerm>
</NewTerms>

这对你有帮助吗?

您还可以查看排序的定义,例如: http://www.w3schools.com/xsl/el_sort.asp http://www.w3.org/TR/xslt#sorting

祝你好运, 彼得

答案 1 :(得分:2)

<xsl:template match="NewTerms">
 <xsl:apply-templates>
  <xsl:sort select="newTerm"/>
 </xsl:apply-templates>
</xsl:template>   
     

我很确定我没有   了解xsl:sort函数

的方式

你是对的。来自http://www.w3.org/TR/xslt#sorting

  

xsl:sort具有select属性   其值是表达式。 每个人   要处理的节点,表达式   使用该节点评估   当前节点和完整的   正在处理的节点列表   未排序的顺序作为当前节点   list。 * 生成的对象是   转换为字符串,就像通过调用一样   到string函数;这个   string用作排序键   那个节点。默认值   select属性为.   导致当前的字符串值   节点用作排序键。

*强调我的。

你想:

<xsl:template match="NewTerms">
 <xsl:apply-templates>
  <xsl:sort/>
 </xsl:apply-templates>
</xsl:template>