我已经找到了答案,坦率地说,我想出了很多可能的答案,我不知所措,所以我仍然不确定如何继续。
我有两个XML文件,我想将它们合并在一起,然后根据三个不同的标准进行排序。
每个文件当然都采用相同的结构:
<root>
<item>
<number>1</number>
<name>Name</name>
<time>6h</time>
<internal>NAME_01</internal>
<flag>0</flag>
</item>
</root>
我只是想将两个文件合并在一起然后排序。排序需要按照这样的顺序进行:
我已经看到很多关于使用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>
如果我能说清楚的话,请告诉我。
非常感谢。
答案 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>