2012-03-18 55 views
0

我試圖寫一個XSL變換的輸入XML這樣的:XSL換每個節點比較嵌入結果集

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

提供生成的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='source'>替代,因爲它沒有在頂層提供。 與<param name='response'/><param name='profile'/>相同。

我一直試圖通過使用嵌套的for-each語句來循環,但xml的結構安裝的方式正在導致我的悲痛。 任何人都可以看到解決這個問題的方法嗎?

回答

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>