使用 XSLT 合并 XML 节点 [英] Merge XML nodes using XSLT
本文介绍了使用 XSLT 合并 XML 节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我需要将我的 XML 转换为另一种数据结构.我收到如下 XML:
I need to transform my XML into another datastructure. I recieve the XML like below:
<results>
<resultset>
<result>
<name>BMW Cars</name>
<code>BMW Pkw</code>
<model.model>730d Saloon</model.model>
<model.name>KM21</model.name>
</result>
<result>
<name>BMW Cars</name>
<code>BMW Pkw</code>
<model.model>120i 3 doors</model.model>
<model.name>UA51</model.name>
</result>
<result>
<name>BMW Cars</name>
<code>BMW Pkw</code>
<model.model>Z4 sDrive23i</model.model>
<model.name>LM31</model.name>
</result>
<result>
<name>Audi</name>
<code>AUDI</code>
<model.model>A4 SAL.3.0 Q SPT TIP 5SPD</model.model>
<model.name>8E2SFZ04</model.name>
</result>
<result>
<name>Audi</name>
<code>AUDI</code>
<model.model>A6 SAL. 2.5TDI SPORT MAN.6SP.</model.model>
<model.name>4B2BBC04</model.name>
</result>
<result>
<name>AUdi</name>
<code>AUDI</code>
<model.model>A8 4.2 QUATTRO 6-SPD TIP</model.model>
<model.name>4E201L04</model.name>
</result>
</resultset>
</results>
我需要它是这样的:
<results>
<resultset>
<result>
<name>BMW Cars</name>
<code>BMW Pkw</code>
<model.model>730d Saloon</model.model>
<model.name>KM21</model.name>
<model.model>120i 3 doors</model.model>
<model.name>UA51</model.name>
<model.model>Z4 sDrive23i</model.model>
<model.name>LM31</model.name>
</result>
<result>
<name>Audi</name>
<code>AUDI</code>
<model.model>A4 SAL.3.0 Q SPT TIP 5SPD</model.model>
<model.name>8E2SFZ04</model.name>
<model.model>A6 SAL. 2.5TDI SPORT MAN.6SP.</model.model>
<model.name>4B2BBC04</model.name>
<model.model>A8 4.2 QUATTRO 6-SPD TIP</model.model>
<model.name>4E201L04</model.name>
</result>
</resultset>
</results>
我花了很多时间来解决这个问题,但到目前为止还没有运气.有谁知道如何解决这个问题?
I've spent a lot of time to solve this, but no luck so far. Does anyone know how to solve this problem?
推荐答案
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes" />
<xsl:key name="groupName" match="//results/resultset/result" use="concat(name, code)" />
<xsl:template match="/">
<results>
<resultset>
<xsl:for-each select="//results/resultset/result[generate-id() = generate-id( key('groupName', concat(name, code)) [1] ) ]" >
<xsl:call-template name="group">
<xsl:with-param name="k1" select="name" />
<xsl:with-param name="k2" select="code" />
</xsl:call-template>
</xsl:for-each>
</resultset>
</results>
</xsl:template>
<xsl:template name="group">
<xsl:param name="k1" />
<xsl:param name="k2" />
<result>
<xsl:copy-of select="name" />
<xsl:copy-of select="code" />
<xsl:for-each select="//results/resultset/result[name = $k1][code = $k2]">
<xsl:copy-of select="model.model" />
<xsl:copy-of select="model.name" />
</xsl:for-each>
</result>
</xsl:template>
</xsl:stylesheet>
这篇关于使用 XSLT 合并 XML 节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文