我正在尝试编写一个xsl来转换输入xml,如下所示:
<transaction>
<message messagetype='Type1'>
<param name='destination'>
<value>some location</value>
</param>
<param name='payload'>
<value>some message</value>
</param>
</message>
<embeddedTransaction>
<message messagetype='Type1'>
<param name='source'>
<value>Default source</value>
</param>
<param name='destination'>
<value>Default destination</value>
</param>
<param name='payload'>
<value>Default payload message</value>
</param>
<param name='response'/>
<param name='profile'/>
</message>
</embeddedTransaction>
</transaction>
以上基本上是一个消息包,子节点<embeddedTransaction>
中的数据定义了顶级<param>
<未提供<message>
时要使用的默认值/ p>
我得到的xml应该是这样的:
<transaction>
<message messagetype='Type1'>
<param name='source'>
<value>Default source</value>
</param>
<param name='destination'>
<value>some location</value>
</param>
<param name='payload'>
<value>some message</value>
</param>
<param name='response'/>
<param name='profile'/>
</message>
</transaction>
请注意<param name='source'>
如何替换<embeddedTransaction>
中的<param name='response'/>
,因为它未在顶级提供。
与<param name='profile'/>
和{{1}}相同。
我一直试图使用嵌套的for-each语句来遍历这个,但是xml的结构设置的方式让我感到悲伤。 任何人都能看到解决方法吗?
答案 0 :(得分:0)
这会产生我想要的结果:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<transaction>
<xsl:apply-templates select="transaction/embeddedTransaction/*"/>
</transaction>
</xsl:template>
<xsl:template match="param">
<xsl:copy-of select="key('p',@name)[1]"/>
</xsl:template>
<xsl:key name="p" match="param" use="@name"/>
</xsl:stylesheet>