XSL для сравнения каждого узла встроенные результирующие наборы - PullRequest
0 голосов
/ 18 марта 2012

Я пытаюсь написать 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>

Полученный 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'/>.

Я пытался обойти это, используя вложенные операторы for-each, но способ настройки структуры xml вызывает у меня горе.Кто-нибудь может найти способ обойти это?

1 Ответ

0 голосов
/ 18 марта 2012

Это дает запрошенный результат, я думаю:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...