合并然后排序两个xml文件

时间:2014-02-16 07:53:26

标签: xml sorting xslt merge

我已经找到了答案,坦率地说,我想出了很多可能的答案,我不知所措,所以我仍然不确定如何继续。

我有两个XML文件,我想将它们合并在一起,然后根据三个不同的标准进行排序。

每个文件当然都采用相同的结构:

<root>
    <item>
        <number>1</number>
        <name>Name</name>
        <time>6h</time>
        <internal>NAME_01</internal>
        <flag>0</flag>
    </item>
</root>

我只是想将两个文件合并在一起然后排序。排序需要按照这样的顺序进行:

  • 标志(这可以是0或1. 0将首先出现。)
  • 数字(从1到20的简单数字。首先排序最低。)
  • 名称(简单字母化。)

我已经看到很多关于使用XSLT的建议,我对此一无所知。我并不反对使用它,前提是我已经给出了如何实现它的一些说明。但它不一定是XSLT。我愿意接受任何选择,简单是关键。可以为我做这件事的免费应用程序(可下载或基于网络)将是我的圣杯。

可接受的排序的一个例子是:

<root>
    <item>
        <number>1</number>
        <name>Apple</name>
        <time>6h</time>
        <internal>FRUIT_APPLE_01</internal>
        <flag>0</flag>
    </item>
    <item>
        <number>1</number>
        <name>Banana</name>
        <time>2h</time>
        <internal>FRUIT_BANANA_01</internal>
        <flag>0</flag>
    </item>
    <item>
        <number>4</number>
        <name>Cabbage</name>
        <time>1h 15m</time>
        <internal>VEGETABLE_CABBAGE_02</internal>
        <flag>0</flag>
    </item>
    <item>
        <number>4</number>
        <name>Cucumber</name>
        <time>25m</time>
        <internal>FRUIT_CUCUMBER_01</internal>
        <flag>0</flag>
    </item>
    <item>
        <number>12</number>
        <name>Avocado</name>
        <time>12h</time>
        <internal>FRUIT_AVOCADO_03</internal>
        <flag>0</flag>
    </item>
    <item>
        <number>3</number>
        <name>Cat</name>
        <time>6h</time>
        <internal>MAMMAL_01</internal>
        <flag>1</flag>
    </item>
    <item>
        <number>8</number>
        <name>Iguana</name>
        <time>1h</time>
        <internal>REPTILE_04</internal>
        <flag>1</flag>
    </item>
</root>

如果我能说清楚的话,请告诉我。

非常感谢。

1 个答案:

答案 0 :(得分:1)

假设您的文件中没有重复项,实际上并不复杂。

由于您根本没有转换元素,因此首先要使用身份模板

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

然后,您只需要编写一个模板来匹配 root 元素(第一个XML文档),因为您将通过添加和重新排序其子节点来更改它。

在合并方面,只需编写 xsl:apply-templates 来选择当前元素的元素,第二个XML文件中的元素。这可以与 xsl:sort 指令一起使用。

     <xsl:apply-templates select="item|document($mergeFile)/root/item">
        <xsl:sort select="flag" />
        <xsl:sort select="number" data-type="number" />
        <xsl:sort select="name" />
     </xsl:apply-templates>

请注意使用文档功能来读取第二个XML文件。在这种情况下, $ mergeFile 是一个参数,设置为您希望与XML当前正在执行的第一个文件合并的第二个文件的位置。

就是这样!试试这个XSLT

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

   <xsl:template match="/*">
      <xsl:copy>
         <xsl:apply-templates select="item|document($mergeFile)/root/item">
            <xsl:sort select="flag" />
            <xsl:sort select="number" data-type="number" />
            <xsl:sort select="name" />
         </xsl:apply-templates>
      </xsl:copy>
   </xsl:template>

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