2017-06-06 2 views
-1

J'ai un fichier xml dont je dois déplacer/copier nœud enfant spécifique qui a un code article du commerce comme Childa au nœud parent en créant un nœud parent vide.Déplacer nœud enfant à nœud parent Sur Condition

Comme EntréeXML:

<root> 
<Payload> 
     <TradeItemVersion> 
      <TradeItemID>A</TradeItemID> 
      <TradeItemTitle>B</TradeItemTitle> 
      <ProductID>C</ProductID> 
     <TradeItemVersion> 
    <Child> 
      <TradeItemID>ChildA</TradeItemID> 
      <TradeItemTitle>Child</TradeItemTitle> 
      <ProductID>Child</ProductID> 
     <Child> 
<Child> 
      <TradeItemID>ChildB</TradeItemID> 
      <TradeItemTitle>Child</TradeItemTitle> 
      <ProductID>Child</ProductID> 
     <Child> 
<Payload> 
<root> 

Sortie finale:

<root> 
<Payload> 
<TradeItemVersion> 
      <TradeItemID>ChildA</TradeItemID> 
      <TradeItemTitle>Child</TradeItemTitle> 
      <ProductID>Child</ProductID> 
     <TradeItemVersion> 
     <TradeItemVersion> 
      <TradeItemID>A</TradeItemID> 
      <TradeItemTitle>B</TradeItemTitle> 
      <ProductID>C</ProductID> 
     <TradeItemVersion> 
<Child> 
      <TradeItemID>ChildB</TradeItemID> 
      <TradeItemTitle>Child</TradeItemTitle> 
      <ProductID>Child</ProductID> 
     <Child> 

<Payload> 
<root> 

J'ai pu copier l'enfant en haut mais tous Childs OBTIENNENT copier et je suis pas en mesure de sélectionner un enfant spécifique, Aussi, je ne pouvais pas créer une nouvelle étiquette parent vide pour mettre l'enfant à l'intérieur.

Mon code est ci-dessous:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*" name="identity"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="TradeItemVersion"> 
     <xsl:apply-templates mode="search"/> 
     <xsl:call-template name="identity"/> 
    </xsl:template> 
    <xsl:template match="Child"/> 
    <xsl:template match="Child" mode="search"> 
     <xsl:call-template name="identity"/> 
    </xsl:template> 
    <xsl:template match="text()" mode="search"/> 


</xsl:stylesheet> 

S'il vous plaît suggérer.

Répondre

0

J'ai trouvé la réponse moi-même après beaucoup de succès et d'essai.

Après XSL convertirait:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*" name="identity"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="TradeItemVersion"> 
     <xsl:apply-templates mode="search"/> 
     <xsl:call-template name="identity"/> 
    </xsl:template> 

<xsl:template match="Child"/> 
    <xsl:template match="Child[contains(TradeItemID,'ChildA')]" mode="search"> 
     <TradeItemVersion> 
<xsl:call-template name="identity"/> 
</TradeItemVersion> 
    </xsl:template> 
    <xsl:template match="text()" mode="search"/> 


</xsl:stylesheet> 

XML d'entrée:

<root> 
<Payload> 
     <TradeItemVersion> 
      <TradeItemID>A</TradeItemID> 
      <TradeItemTitle>B</TradeItemTitle> 
      <ProductID>C</ProductID> 

    <Child> 
      <TradeItemID>ChildA</TradeItemID> 
      <TradeItemTitle>Child</TradeItemTitle> 
      <ProductID>Child</ProductID> 
     </Child> 
<Child> 
      <TradeItemID>ChildB</TradeItemID> 
      <TradeItemTitle>Child</TradeItemTitle> 
      <ProductID>Child</ProductID> 
     </Child> 
</TradeItemVersion> 
</Payload> 
</root> 

XML de sortie:

<root> 
    <Payload> 
    <TradeItemVersion> 
     <Child> 
     <TradeItemID>ChildA</TradeItemID> 
     <TradeItemTitle>Child</TradeItemTitle> 
     <ProductID>Child</ProductID> 
     </Child> 
    </TradeItemVersion> 
    <TradeItemVersion> 
     <TradeItemID>A</TradeItemID> 
     <TradeItemTitle>B</TradeItemTitle> 
     <ProductID>C</ProductID> 
    </TradeItemVersion> 
    </Payload> 
</root>