2011-04-08 392 views
1

我是XSLT的新手,虽然我已经成功地完成了许多任务,但到目前为止......排序让我很难。对XML文件的节点进行排序

我需要一个小例子的帮助,以便我能更好地理解xsl:sort。

我的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是如下:

<?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:排序功能。如果你帮助我通过这个小例子...我想我会更好地理解它。

谢谢。

茉莉

回答

5

我想你,因为在你的<xsl:output>的方法是“XML”又要有效的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

最好的问候, 彼得

+0

谢谢你非常非常......有时候有一个具体的例子有助于理解比读理论概念更....所以,再次感谢您:) .. 。你是对的,我正在处理一个.xml输出。周末愉快! – Jasmin 2011-04-08 12:31:24

+0

您能解释一下为什么我们应该使用“@ * | node()”...因为我的印象是我应该直接命名我想排序的节点名称。当然我错了,但想知道为什么? – Jasmin 2011-04-08 12:43:28

+0

@Jasmin:你所做的只是复制整个XML结构,然后添加xsl:sort元素。这种复制机制被称为“身份变换”。请看看:http://www.w3.org/TR/xslt#copying这是非常有用的。 – Peter 2011-04-08 13:26:06

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

我非常肯定,我没有 了解如何XSL:排序功能

你说得对。从http://www.w3.org/TR/xslt#sorting

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

*重点是我的。

你想:

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

+1,用于解释OP代码中的问题。 – 2011-04-08 13:20:21

+0

+1谢谢你的确切解释。我刚刚提供了一个解决方案,以原始代码。 – Peter 2011-04-08 13:32:51