2011-08-17 59 views
3

是否可以使用XSLT对XML文件中的项目进行分组?XML中的组元素

输入文件:

<start> 

<A> 
---data--- 
</A> 

<B> 
---data--- 
</B> 

<C> 
---data--- 
</C> 

<A> 
---data--- 
</A> 

<B> 
---data--- 
</B> 

</start> 

输出应该是:

<start> 

<A> 
---data--- 
</A> 

<A> 
---data--- 
</A> 

<B> 
---data--- 
</B> 

<B> 
---data--- 
</B> 

<C> 
---data--- 
</C> 

</start> 

我该怎么做,使用XSL?还是有更好的方法来做到这一点?

谢谢。

+0

它是通过分拣元素名称? –

+0

有点这样,是的...开始是根节点 – Anon

+0

所以,看看我的答案。 –

回答

6

样品输入:

<start> 
    <A>1</A> 
    <B>2</B> 
    <C>3</C> 
    <A>4</A> 
    <B>5</B> 
</start> 

XSLT:

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

    <xsl:template match="start"> 
     <xsl:copy> 
      <xsl:for-each select="*"> 
       <xsl:sort select="name()"/> 

       <xsl:copy-of select="."/> 

      </xsl:for-each> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

输出:

<start> 
    <A>1</A> 
    <A>4</A> 
    <B>2</B> 
    <B>5</B> 
    <C>3</C> 
</start> 
+0

如果元素包含其他密钥?同样的事情会起作用还是需要改变? – Anon

+0

此模板仅按元素的名称排序元素。它不依赖于节点的内容。 –

+0

谢谢队友......还有一个问题,如果根节点包含模式呢?例如。 ... ...模板匹配=似乎不允许更多引号? – Anon

0

与排序,分组不直接支持XSLT我觉得

0

是它是,试试这个....

<xsl:template match="/"> 
    <xsl:for-each select="start/*"> 
     <xsl:sort select="name(.)"/> 
     <xsl:element name="{name()}"> 
      <xsl:value-of select="." /> 
     </xsl:element> 
    </xsl:for-each> 
</xsl:template> 

+0

Kirill使用copy-to是一种更好的方法,因为它会制作节点的精确副本,包括所有属性和子节点 – Jerry