【问题标题】:XSL for-each node comparison embedded result setsXSL for-each 节点比较嵌入式结果集
【发布时间】:2012-03-18 14:17:14
【问题描述】:

我正在尝试编写一个 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>

上面基本上是一个消息包,子节点&lt;embeddedTransaction&gt;中的数据定义了在顶级&lt;message&gt;没有提供&lt;param&gt;时使用的默认值

我需要的生成的 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>

注意&lt;param name='source'&gt; 是如何被&lt;embeddedTransaction&gt; 中的那个替换的,因为它没有在顶层提供。 与&lt;param name='response'/&gt;&lt;param name='profile'/&gt; 相同。

我一直在尝试使用嵌套的 for-each 语句循环执行此操作,但设置 xml 结构的方式让我很伤心。 任何人都可以解决这个问题吗?

【问题讨论】:

    标签: xml xslt foreach


    【解决方案1】:

    这会产生我认为的请求结果:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 2012-10-11
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      相关资源
      最近更新 更多