0

接收递归 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. 然后将排除的子元素复制到新的根元素下。

到目前为止都试过了。
递归部分的部分解决方案。它不排除根元素<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>
4

1 回答 1

0

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

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

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

于 2013-10-11T18:04:07.153 回答