XSLT:转换递归和可重复的Xml

时间:2013-10-11 16:00:36

标签: java xml xslt

接收递归xml这样的遗留应用程序

<ResponseXml>
    <AccountData>
    <AccountInformation>
     <AccountNumber>123465</AccountNumber>
     <BankCode>456</BankCode>
     <OwnerInformation>
      <FirstName>Himanshu</FirstName>
      <LastName>Yadav</LastName>
     </OwnerInformation>
     <AccountInformation>
      <AccountNumber>78910</AccountNumber>
      <BankCode>123</BankCode>
      <OwnerInformation>
       <FirstName>My</FirstName>
       <LastName>Wife</LastName>
      </OwnerInformation>
     </AccountInformation>
    </AccountInformation>
   </AccountData>
   </ResponseXml>

必须格式化为:

<BillingInformation>
 <AccountNumber>123465</AccountNumber>
 <BankCode>456</BankCode>
</BillingInformation>
<ClientInfo>
 <FirstName>Himanshu</FirstName>
 <LastName>Yadav</LastName>
</ClientInfo>
<BillingInformation2>
 <AccountNumber>78910</AccountNumber>
 <BankCode>123</BankCode>
</BillingInformation2>
<ClientInfo>
 <FirstName>My</FirstName>
 <LastName>Wife</LastName>
</ClientInfo>

对XSLT转换不熟悉我遇到了多个问题:

  1. 在复制父值时排除子元素。
  2. 然后在新的根元素下复制排除的子元素。
  3. 目前已尝试过。
    递归部分的部分解决方案。它不会排除根元素<ResponseXml><AccountData>

    <xsl:template match="@* | node()">
        <xsl:copy>
          <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
      </xsl:template>
    
      <xsl:template match="AccountInformation">
        <BillingInformation>
          <xsl:apply-templates select="*[name()!='AccountInformation']"/>
        </BillingInformation>
        <xsl:apply-templates select="AccountInformation"/>
      </xsl:template>
    
      <xsl:template match="AccountInformation/AccountInformation">
        <BillingInformation2>
          <xsl:apply-templates/>
        </BillingInformation2>
      </xsl:template>
    

1 个答案:

答案 0 :(得分:0)

由于您使用的是身份模板,因此您必须覆盖该模板以用于您要操作的任何元素。在这种情况下,如果您只需删除ResponseXmlAccountData元素,那么您只需为它们创建一个空模板。

<xsl:template match="ResponseXml | AccountData">
  <xsl:apply-templates/>
</xsl:template>

将上面的行添加到您的XSL然后它将不会输出这两个元素。