我有一个问题是从XML文件中分组一些标签。我想在标签nr之后对元素进行分组,并将它们放在新的标签masini中。我在输入这个XML:
<nota> <auto> <nr> 1 </nr> <bmw>masina tare</bmw> <mercedes> masina tiganeasca</mercedes> <dacia> masina romaneasca</dacia> </auto> <auto> <nr> 12 </nr> <bmw>2041</bmw> <mercedes> masina tdadsa</mercedes> <dacia> masina veche</dacia> </auto> <auto> <nr> 1 </nr> <bmw>masina tare</bmw> <mercedes> masina tiganeasca</mercedes> <dacia> masina romaneasca</dacia> </auto> </nota>
我想得到:
<nota>
<masini>
<auto>
<nr> 1 </nr>
<bmw>masina tare</bmw>
<mercedes> masina tiganeasca</mercedes>
<dacia> masina romaneasca</dacia>
</auto>
<auto>
<nr> 1 </nr>
<bmw>masina tare</bmw>
<mercedes> masina tiganeasca</mercedes>
<dacia> masina romaneasca</dacia>
</auto>
</masini>
<masini>
<auto>
<nr> 12 </nr>
<bmw>2041</bmw>
<mercedes> masina tdadsa</mercedes>
<dacia> masina veche</dacia>
</auto>
</masini>
</nota>
如果有两个nr相等,则应该有两个自动标签,其元素在同一个masini标签中。对不起我英语,并提前谢谢。
答案 0 :(得分:1)
在XSLT1.0中,最有效的技术称为Muenchian Grouping。
首先,您定义一个 xsl:key ,它将用于查找组中的项目。在这种情况下,您正在寻找名称为 nr 元素值的自动元素:
<xsl:key name="auto" match="auto" use="nr" />
接下来,您需要查找 auto 元素,它们是组中的第一个元素(即它们包含每个不同 nr 元素的首次出现*
<xsl:apply-templates
select="auto[generate-id() = generate-id(key('auto', nr)[1])]" mode="group" />
然后,对于每个这样的'distinct'元素,您可以使用模板匹配将组中的所有元素放入新元素中
<xsl:template match="auto" mode="group">
<masini>
<xsl:apply-templates select="key('auto', nr)" />
</masini>
</xsl:template>
这是完整的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="auto" match="auto" use="nr" />
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="auto[generate-id() = generate-id(key('auto', nr)[1])]" mode="group" />
</xsl:copy>
</xsl:template>
<xsl:template match="auto" mode="group">
<masini>
<xsl:apply-templates select="key('auto', nr)" />
</masini>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
当应用于您的示例XML时,输出以下内容
<nota>
<masini>
<auto>
<nr> 1 </nr>
<bmw>masina tare</bmw>
<mercedes> masina tiganeasca</mercedes>
<dacia> masina romaneasca</dacia>
</auto>
<auto>
<nr> 1 </nr>
<bmw>masina tare</bmw>
<mercedes> masina tiganeasca</mercedes>
<dacia> masina romaneasca</dacia>
</auto>
</masini>
<masini>
<auto>
<nr> 12 </nr>
<bmw>2041</bmw>
<mercedes> masina tdadsa</mercedes>
<dacia> masina veche</dacia>
</auto>
</masini>
</nota>
另外,请注意使用Identity Transform复制XML中的所有现有元素。