Transformation in XSLT with Recursive Nested Templ

2019-09-10 02:25发布

问题:

I have this Entry Input XML

<BusinessInteractionTypes>
   <BusinessInteractionType>
     <TypeId>123</TypeId>
     <Name>Foo</Name>
     <Description>XSLT</Description>
   </BusinessInteractionType>
   ...a lot BusinessInteractionType Elements
</BusinessInteractionTypes>

But a have a lot of transformation (to SOA case), I need Transform this input using XSLT to:

<businessInteractionTypes>
  <businessInteractionType>
   <BusinessInteractionType>   <!-- Just first input node -->
     <TypeId/>
   </BusinessInteractionType>
  </businessInteractionType>
  <businessInteractionTypeHas> <!-- Recursive interaction began -->
    <businessInteractionType>
      <BusinessInteractionType>
       <TypeId />
      </BusinessInteractionType>

      <businessInteractionTypeHas>
       ... recursive
    </businessInteractionType>
  </businessInteractionTypeHas>
</businessInteractionTypes>

回答1:

Srs, I fix the issue... follow Thanks all

<?xml version="1.0" encoding="UTF-8"?>

<xsl:template match="cus:BusinessInteractionType">
    <xsl:call-template name="Master">
      <xsl:with-param name="nodeD" select="bus1:BusinessInteractionType"/>
  </xsl:call-template>
</xsl:template>

<xsl:template name="Master">
    <xsl:param name="nodeD" select="bus1:BusinessInteractionType"/>

    <cas:businessInteractionTypes>
        <cas:businessInteractionType>
            <xsl:if test="bus1:BusinessInteractionType[position() = 1]">
                <bus3:BusinessInteractionType>
                    <bus1:TypeId>
                        <xsl:value-of select="//bus1:TypeId"/>
                    </bus1:TypeId>
                </bus3:BusinessInteractionType>
            </xsl:if>
            <xsl:call-template name="MasterNested">
                <xsl:with-param name="current_node" select="bus1:BusinessInteractionType[position()>1]"/>
            </xsl:call-template>
        </cas:businessInteractionType>    
    </cas:businessInteractionTypes>
</xsl:template>

<xsl:template name="MasterNested">

    <xsl:param name="current_node" select="bus1:BusinessInteractionType"/>

    <xsl:if test="$current_node">
        <cas:businessInteractionTypeHas>
            <cas:businessInteractionType>
                <bus3:TypeId>
                    <xsl:value-of select="$current_node//bus1:TypeId"/>
                </bus3:TypeId>
                <bus3:Name>
                    <xsl:value-of select="$current_node//bus1:Name"/>
                </bus3:Name>
                <bus3:Description>
                    <xsl:value-of select="$current_node//bus1:Description"/>
                </bus3:Description>
            </cas:businessInteractionType>
            <xsl:call-template name="MasterNested">
                <xsl:with-param name="current_node" select="$current_node/following-sibling::node()"/>
            </xsl:call-template>
        </cas:businessInteractionTypeHas>
    </xsl:if>
</xsl:template>