使用xsl追加相同id的值

时间:2013-09-13 10:41:13

标签: xml xslt append

我是xsl转换的新手,并且在网络上找不到我的问题的解决方案。

我有一个xml文件,如下所示:

<xml>
<id>1</id>
<value>abc</value>
<id>1</id>
<value>def</value>
<id>2</id>
<value>xyz</value>
<id>2</id>
<value>hij</value>
.
.
</xml>

现在我需要一个附加了以下值的xml:

 <xml>
<id>1</id>
<value>abc, def</value>
<id>2</id>
<value>xyz, hij</value>
.
.
</xml>

有没有人可以帮助我解决这个问题如何使用xslt?

我没有完全按照我给你的格式。 实际上它看起来像这样:

<xml>
<objects>
<record>
<attribute>
<id>1</id>
<valuegroup>
<value>abc</value>
</valuegroup>
</attribute>
</record>

 <record>
<attribute>
<id>1</id>
<valuegroup>
<value>def</value>
</valuegroup>
</attribute>
</record>

 <record>
<attribute>
<id>2</id>
<valuegroup>
<value>hij</value>
</valuegroup>
</attribute>
</record>

 <record>
<attribute>
<id>2</id>
<valuegroup>
<value>xyz</value>
</valuegroup>
</attribute>
</record>
</objects>
</xml>

抱歉我的注意力不集中。

1 个答案:

答案 0 :(得分:1)

使用像Saxon 9或AltovaXML或XmlPrime这样的XSLT 2.0处理器,你可以使用

<xsl:template match="xml">
  <xsl:copy>
    <xsl:for-each-group select="value" group-by="preceding-sibling::id[1]">
      <id><xsl:value-of select="current-grouping-key()"/></id>
      <value><xsl:value-of select="current-group()" separator=", "/></value>
    </xsl:for-each-group>
  </xsl:copy>
</xsl:template>

使用XSLT 1.0:

<xsl:key name="k1" match="xml/value" use="preceding-sibling::id[1]"/>

<xsl:template match="xml">
  <xsl:copy>
    <xsl:apply-templates select="value[generate-id() = generate-id(key('k1', preceding-sibling::id[1])[1])]"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="value">
  <xsl:copy-of select="preceding-sibling::id[1]"/>
  <value>
    <xsl:for-each select="key('k1', preceding-sibling::id[1])">
      <xsl:if test="position() > 1"><xsl:text>, </xsl:text></xsl:if>
      <xsl:value-of select="."/>
    </xsl:for-each>
  </value>
</xsl:template>