XSL for-each节点比较嵌入式结果集

时间:2012-03-18 14:17:15

标签: xml xslt foreach

我正在尝试编写一个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的结构设置的方式让我感到悲伤。 任何人都能看到解决方法吗?

1 个答案:

答案 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>