0

这是大 xml 转换的一部分。
输入 XML

<Root>
 <Family>
   <Entity>
     <SomeElement1/>
     <ClientVO>
     <FirstName>Himanshu</FirstName>
     <LastName>Yadav</LastName>
     <ClientAddress>
      <AddressLine>Somewhere In downtown</AddressLine>
      <City>Chicago</City>
      <State>IL</State>
     </ClientAddress>
    </ClientVO>
     <Child2>
       <Element2/>
     </Child2>
     <Entity>
     <SomeElement1/>
     <ClientVO>
     <FirstName>Himanshu</FirstName>
     <LastName>Yadav</LastName>
     <ClientAddress>
      <AddressLine>Somewhere In downtown</AddressLine>
      <City>Chicago</City>
      <State>IL</State>
     </ClientAddress>
    </ClientVO>
     <Child2>
       <Element222/>
     </Child2>
   </Entity>
  </Entity>
 </Family>
</Root>

输出 XML

<Response>
 <EntityRoot>
  <SomeElement1/>
 </EntityRoot>

 <ClientInformation>
     <FirstName>Himanshu</FirstName>
     <LastName>Yadav</LastName>
     <AddressLine>Somewhere In downtown</AddressLine>
     <City>Chicago</City>
     <State>IL</State>
    </ClientInformation>

 <Child2Root>
   <Element2>
 </Child2Root>

 <MetadataEntityRoot>
  <SomeElement1/>
 </MetadataEntityRoot>

 <ClientInformation>
     <FirstName>Himanshu</FirstName>
     <LastName>Yadav</LastName>
     <AddressLine>Somewhere In downtown</AddressLine>
     <City>Chicago</City>
     <State>IL</State>
    </ClientInformation>

 <Child2Root>
   <Element222>
 </Child2Root>
</Response>

尝试在 xslt 下面给出但不是一个可行的解决方案,因为在<ClientVO>or下可能有更多元素<ClientAddress>。这更像是我想避免的一对一映射。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
   </xsl:template>
    <xsl:template match="Entity">
      <EntityRoot>
        <xsl:apply-templates select="@* | node()[not(self::ClientVO| self::Child2)]" />
      </EntityRoot>
      <xsl:apply-templates select="ClientVO| Child2" />
    </xsl:template>
    <xsl:template match="ClientVO">
      <ClientInformation>
       <FirstName><xsl:value-of select="FirstName"/></FirstName>
       <LastName><xsl:value-of select="LastName"/></LastName>
       <xsl:for-each select="ClientAddress">
         <AddressLine><xsl:value-of select="AddressLine"/></AddressLine>
         <City><xsl:value-of select="City"/></City>
         <State><xsl:value-of select="State"/></State>
       </xsl:for-each>
      </ClientInformation>
    </xsl:template>
    <xsl:template match="Child2">
      <Child2Root><xsl:apply-templates select="@*|node()" /></Child2Root>
    </xsl:template>
</xsl:stylesheet>
4

2 回答 2

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

<xsl:template match="ClientAddress">
  <xsl:apply-templates />
</xsl:template>

如果您想以 1:1 映射大多数事物,请从标识模板开始,并根据需要覆盖它。

于 2013-10-15T15:36:40.190 回答
1

这是您最后几个问题的答案的相同模式的另一个实例 - 让身份模板为您完成大部分工作,并在需要时覆盖它。在这种情况下,您需要重命名ClientVOClientInformation

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

并跳过ClientAddress但继续处理它的孩子

<xsl:template match="ClientAddress">
  <xsl:apply-templates />
</xsl:template>
于 2013-10-15T16:35:52.033 回答