0

我在对 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 相等,则应该有两个 auto 标记,它们的元素位于同一个 masini 标记中。对不起我的英语,提前谢谢。

4

1 回答 1

1

在 XSLT1.0 中,最有效的技术称为Muenchian Grouping

首先,您定义一个xsl:key用于查找组中的项目。在这种情况下,您正在寻找名称为nr元素值的auto元素:

<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" />

然后,对于每个这样的“不同”元素,您可以进行模板匹配以将组中的所有元素放入一个新元素中

<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>

此外,请注意使用身份转换复制 XML 中的所有现有元素。

于 2012-08-30T09:15:53.710 回答