0

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

对不起我的疏忽。

4

1 回答 1

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>
于 2013-09-13T11:06:42.913 回答