我一直在寻找答案,坦率地说,我想出了很多可能的答案,以至于我不知所措,所以我仍然不确定如何进行。
我有两个XML文件,我想将它们合并在一起,然后根据三个独立的标准进行排序。
当然,每个文件都具有相同的结构:
<root>
<item>
<number>1</number>
<name>Name</name>
<time>6h</time>
<internal>NAME_01</internal>
<flag>0</flag>
</item>
</root>
我只是想将两个文件合并在一起,然后进行排序。排序需要按以下顺序进行:
我已经看到了许多有关XSLT的建议,但我对此一无所知。我不反对使用它,但前提是我已获得有关如何实现它的一些说明。不过,它不一定是XSLT。我愿意接受任何选择,简单是关键。可以为我做到这一点的免费应用程序(可下载或基于Web的应用程序)将是我的圣杯。
可接受的排序示例如下:
<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>
请让我知道是否可以澄清任何事情。
非常感谢。
假设您的文件中没有重复项,那么实际上并没有那么复杂。
由于您根本不转换项目元素,因此您可以使用身份模板开始
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
然后,您只需要编写一个模板来匹配(第一个XML文档的)根元素,因为您将通过添加和重新排序其子节点来对其进行更改。
在合并这方面,只写一个XSL:申请模板选择项电流的元素根元素,而项目第二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>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句