2017-06-14 77 views
0

我在使用xslt将以下源XML转换为目标XML。XSLT转换

在源XML我有多个action标签。 每action/action_kind/code='pickup'会有另外action/action_kind/code='deliver'

在这两种action标签orderId是一样的。

我需要选择基于此fromto标签,我需要填充下图的目标XMLas。

源XML

<section> 
 
    
 
    <action> 
 
    <action_kind> 
 
     <code>pickup</code> 
 
    </action_kind> 
 
    <pickup> 
 
     <orderId>11</orderId> 
 
    </pickup> 
 
    <name>NameOne</name> 
 
    <address>AddressOne</address> 
 
    </action> 
 
    
 
    <action> 
 
    <action_kind> 
 
     <code>pickup</code> 
 
    </action_kind> 
 
    <pickup> 
 
     <orderId>22</orderId> 
 
    </pickup> 
 
    <name>NameTwo</name> 
 
    <address>AddressTwo</address> 
 
    </action> 
 
    
 
    <action> 
 
    <action_kind> 
 
     <code>deliver</code> 
 
    </action_kind> 
 
    <expected> 
 
     <from>FirstOrderFro</from> 
 
     <to>FirstOrderTo</to> 
 
    </expected> 
 
    <delivery> 
 
     <orderId>11</orderId> 
 
    </delivery> 
 
    </action> 
 
    
 
    <action> 
 
    <action_kind> 
 
     <code>deliver</code> 
 
    </action_kind> 
 
    <expected> 
 
     <from>ScondOrderFro</from> 
 
     <to>SecondOrderTo</to> 
 
    </expected> 
 
    <delivery> 
 
     <orderId>22</orderId> 
 
    </delivery> 
 
    </action> 
 
    
 
</section>

目标XML

<Orders> 
 
    <Order> 
 
    <OrderId>11</OrderId> 
 
    <Name>NameOne</Name> 
 
    <Address>AddressOne</Address> 
 
    <From>FirstOrderFro</From> 
 
    <To>FirstOrderTo</To> 
 
    </Order> 
 
    <Order> 
 
    <OrderId>22</OrderId> 
 
    <Name>NameTwo</Name> 
 
    <Address>AddressTwo</Address> 
 
    <From>SecondOrderFro</From> 
 
    <To>SecondOrderTo</To> 
 
    </Order> 
 
</Orders>

有人能给我的xslt解决方案,它可以将源XML转换为目标XML?

+2

你忘了问一个问题,或者试图自己解决问题,或者解释你到目前为止尝试过哪些地方出了问题。 –

+0

我正在寻找将源XML转换为目标XML的xslt解决方案 – Jagadeesh

+2

我们不为您编写代码,我们回答您的问题。你的问题是什么? –

回答

0

尝试了多种方法后,我发现下面的方式来获得预期的输出。

<xsl:template match="/"> 
 
    <Orders> 
 
    <xsl:for-each select="/section/action"> 
 
     <xsl:variable name="PickupOrderId" select="pickup/orderId"/> 
 
     <xsl:if test="action_kind/code='pickup'"> 
 
     <Order> 
 
      <OrderId> 
 
      <xsl:value-of select="pickup/orderId"/> 
 
      </OrderId> 
 
      <Name> 
 
      <xsl:value-of select="name"/> 
 
      </Name> 
 
      <Address> 
 
      <xsl:value-of select="address"/> 
 
      </Address> 
 
      <xsl:for-each select="/section/action"> 
 
      <xsl:if test="action_kind/code='deliver'"> 
 
       <xsl:if test="./delivery/orderId=$PickupOrderId"> 
 
       <From> 
 
        <xsl:value-of select="expected/from"/> 
 
       </From> 
 
       <To> 
 
        <xsl:value-of select="expected/to"/> 
 
       </To> 
 
       </xsl:if> 
 
      </xsl:if> 
 
      </xsl:for-each> 
 
     </Order> 
 
     </xsl:if> 
 
    </xsl:for-each> 
 
    </Orders> 
 
</xsl:template>

0

下面是使用Muenchian分组的就像我在我的评论中提到的另一种选择。

XML输入

<section> 
    <action> 
     <action_kind> 
      <code>pickup</code> 
     </action_kind> 
     <pickup> 
      <orderId>11</orderId> 
     </pickup> 
     <name>NameOne</name> 
     <address>AddressOne</address> 
    </action> 
    <action> 
     <action_kind> 
      <code>pickup</code> 
     </action_kind> 
     <pickup> 
      <orderId>22</orderId> 
     </pickup> 
     <name>NameTwo</name> 
     <address>AddressTwo</address> 
    </action> 
    <action> 
     <action_kind> 
      <code>deliver</code> 
     </action_kind> 
     <expected> 
      <from>FirstOrderFro</from> 
      <to>FirstOrderTo</to> 
     </expected> 
     <delivery> 
      <orderId>11</orderId> 
     </delivery> 
    </action> 
    <action> 
     <action_kind> 
      <code>deliver</code> 
     </action_kind> 
     <expected> 
      <from>ScondOrderFro</from> 
      <to>SecondOrderTo</to> 
     </expected> 
     <delivery> 
      <orderId>22</orderId> 
     </delivery> 
    </action> 
</section> 

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:key name="actionByOrderId" match="action" use="*/orderId"/> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="section"> 
    <Orders> 
     <xsl:apply-templates select="@*"/> 
     <xsl:for-each select="action[count(.|key('actionByOrderId',*/orderId)[1])=1]"> 
     <Order> 
      <OrderId><xsl:value-of select="*/orderId"/></OrderId> 
      <xsl:apply-templates select="key('actionByOrderId',*/orderId)"/>   
     </Order> 
     </xsl:for-each> 
    </Orders> 
    </xsl:template> 

    <xsl:template match="action"> 
    <xsl:apply-templates select="name|address|expected/*"/> 
    </xsl:template> 

</xsl:stylesheet> 

输出

<Orders> 
    <Order> 
     <OrderId>11</OrderId> 
     <name>NameOne</name> 
     <address>AddressOne</address> 
     <from>FirstOrderFro</from> 
     <to>FirstOrderTo</to> 
    </Order> 
    <Order> 
     <OrderId>22</OrderId> 
     <name>NameTwo</name> 
     <address>AddressTwo</address> 
     <from>ScondOrderFro</from> 
     <to>SecondOrderTo</to> 
    </Order> 
</Orders> 

注:我离开了在p艺术资本化元素名称的第一个字母。