2017-05-21 45 views
0

我想排序两个xml文件,以便将它们与winmerge进行比较,但是当我设法排序节点时我遇到了一个问题,但是我还需要使用一样的名字。在xml中使用xslt多重排序

这里是我的xml:

<node> 
    <location>A</location> 
    <title>folder in A</title> 
    <acl group="group_4" permissions="111111111"/> 
    <acl group="group_2" permissions="110000000"/> 
    <acl group="group_3" permissions="110000000"/> 
    <acl group="group_1" permissions="110000000"/> 
</node> 
<node> 
    <location>A</location> 
    <title>Another folder in A</title> 
    <acl group="group_1" permissions="110000000"/> 
    <acl group="group_3" permissions="111111111"/> 
    <acl group="group_2" permissions="110000000"/> 
</node> 

我的XSL是这样的:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" encoding="UTF-8" /> 
    <xsl:template match="/"> 
    <xsl:for-each select="import/node"> 
     <xsl:sort select="location" data-type="text" order="ascending"/> 
     <xsl:sort select="title[not(@clear)]" data-type="text" order="ascending"/> 
     <xsl:sort select="@group" data-type="text" order="ascending"/> 
     <node> 
     <xsl:copy-of select="location"/> 
     <xsl:copy-of select="title[not(@clear)]"/> 
     <xsl:copy-of select="acl[not(@basegroup) and not(@baseowner) and not(@standard)]"/> 
     </node> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

,我已经得到了这样的结果:不是这一个

<node> 
    <location>A</location> 
    <title>Another folder in A</title> 
    <acl group="group_1" permissions="110000000"/> 
    <acl group="group_3" permissions="111111111"/> 
    <acl group="group_2" permissions="110000000"/> 
</node> 
<node> 
    <location>A</location> 
    <title>folder in A</title> 
    <acl group="group_4" permissions="111111111"/> 
    <acl group="group_2" permissions="110000000"/> 
    <acl group="group_3" permissions="110000000"/> 
    <acl group="group_1" permissions="110000000"/> 
</node> 

<node> 
    <location>A</location> 
    <title>Another folder in A</title> 
    <acl group="group_1" permissions="110000000"/> 
    <acl group="group_2" permissions="110000000"/> 
    <acl group="group_3" permissions="111111111"/> 
</node> 
<node> 
    <location>A</location> 
    <title>folder in A</title> 
    <acl group="group_1" permissions="110000000"/> 
    <acl group="group_2" permissions="110000000"/> 
    <acl group="group_3" permissions="110000000"/> 
    <acl group="group_4" permissions="111111111"/> 
</node> 

我已经检查到类似的帖子,但没有任何工作。提前致谢。最好的祝福。

+1

你举的例子是不明确的。看来你想通过'location'和'title'对'node'元素进行排序,然后在每个节点**内对**元素进行排序,并通过'group'属性对'act'元素进行排序。你实际上做的是试图通过它们没有的'group'属性对'node'元素进行排序。 –

+0

你好迈克尔,你是对的,我尝试按位置和标题排序节点元素,然后在每个节点中排序acl属性。为了做到这一点,我需要创建一个临时组吗? –

回答

0

您需要的acl要素分别进行排序,自己的xsl:for-each(或xsl:apply-templates)指令中 - 是这样的:

XSLT 1.0

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

<xsl:template match="/import"> 
    <xsl:for-each select="node"> 
     <xsl:sort select="location" data-type="text" order="ascending"/> 
     <xsl:sort select="title" data-type="text" order="ascending"/> 
     <node> 
      <xsl:copy-of select="location | title"/> 
      <xsl:for-each select="acl"> 
       <xsl:sort select="@group" data-type="text" order="ascending"/> 
       <xsl:copy-of select="."/> 
      </xsl:for-each> 
     </node> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 
+0

谢谢迈克尔这是工作:) –

+0

祝你有美好的一天。最好的祝福 –