xslt copy deep xml if if exists not exists

时间:2017-04-19 18:22:07

标签: xslt-1.0

<root>   
 <xnode>
    <Node1/>
    <Node2/>
    <Node3> 
       <CNode1>
         <CCNode1>
            <CCField1>
            <CCField2>
               <CCCNode1/>
          </CCNode1>
         <CCNode2>
            <CCCNode3/>
     </Node3>

      <Node4/>
</xnode>
 <xnode>
    <Node1/>
    <Node2/>
    <Node3> 
       <CNode1>
           <CCNode2>
            <CCCNode3/>
     </Node3>
      <Node4/>
   </xnode>
  <xnode>
    <Node1/>
    <Node2/>
    <Node3> 
       <CNode1>
         <CCNode1>
            <CCField1>
            <CCField2>
               <CCCNode1/>
          </CCNode1>
         <CCNode2>
            <CCCNode3/>
      </Node3>
      <Node4/>
   </xnode>
 </root>

在上面的xml中,我需要复制除Node3以外的所有节点和值 - CNode1 - CCNode1。即,如果CCNode1存在副本,因为它包含子元素,如果不存在,则创建具有相应字段和子元素的CCNode1。例如,这里第一个和第三个xnode具有CCNode1,而在第二个xnode中缺少它。因此,按原样复制第一个和第三个节点1,并在第二个xnode中创建CCNode1及其子元素,并使用一些虚拟值。

请建议如何使用XSLT实现此目的。

感谢

1 个答案:

答案 0 :(得分:0)

所以,我能说的最好的是你需要一个身份模板来复制一切。然后,您需要一个如下所示的模板来选择没有CCNode1节点的Node3 / CNode1节点。在那里你可以添加你的节点。

<xsl:template match="Node3/CNode1[not(.//CCNode1)]">
  <xsl:copy>

     Add your ccNode1 and child nodes here.

     <!-- Output other child nodes of CNode1  -->
     <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
</xsl:template>

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