我是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>
抱歉我的注意力不集中。
答案 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>