2016-05-28 3 views
0

<animal> Wenn mehr als 1 hat, dann müssen <xxx> i <animal> (duplicate count = Anzahl der innerhalb des entsprechenden <xxx><animal> wiederholend) duplizieren und die sich wiederholenden <xxx> in eine andere Kopie zu bewegen.Bewegen wiederholenden Elementen in eine Kopie des übergeordneten

In meinem xml <xxx> ist zweimal für die erste Instanz von <animal> zu wiederholen, so im Ausgang muss ich zwei <animals> haben. Die erste <animal> sollte zunächst von <xxx> enthalten und zweiten <animal> sollte zweite Instanz von <xxx>

Eingang xml

<?xml version="1.0" encoding="UTF-8"?> 
<header> 
    <animal> 
     <element1>element1</element1> 
     <element2>element2</element2> 
     <element3 lang="en">element3</element3> 
     <xxx> 
      <code>YY</code> 
      <description>code yy</description> 
     </xxx> 
     <xxx> 
      <code>ZZ</code> 
      <description>code zz</description> 
     </xxx> 
    </animal> 
    <animal> 
     <xxx> 
      <code>AA</code> 
      <description>code aa</description> 
     </xxx> 
    </animal> 
</header> 

Erforderlich erforderliche Transformation

<?xml version="1.0" encoding="UTF-8"?> 
<header> 
    <animal> 
     <element1>element1</element1> 
     <element2>element2</element2> 
     <element3 lang="en">element3</element3> 
     <xxx> 
      <code>YY</code> 
      <description>code yy</description> 
     </xxx>   
    </animal> 
    <animal> 
     <element1>element1</element1> 
     <element2>element2</element2> 
     <element3 lang="en">element3</element3>   
     <xxx> 
      <code>ZZ</code> 
      <description>code zz</description> 
     </xxx> 
    </animal> 
    <animal> 
     <xxx> 
      <code>AA</code> 
      <description>code aa</description> 
     </xxx> 
    </animal> 
</header> 

Jede Hilfe enthalten ist viel appriciated. Vielen Dank im Voraus

+0

Wo genau sind Sie mit diesem stecken? –

+0

"* Wenn mehr als 2 *" Ich denke, du meinst mehr als 1? –

+0

@ michael.hor257k können Sie PLZ die Ressource, die Sie verwendet haben, um xslt zu lernen. – Sowmiya

Antwort

2

Meine Lösungen sind in der Regel nicht das eleganteste, aber dies würde die gewünschte Ausgabe erzeugen - hat einen Blick ...

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 

<xsl:transform version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 


<xsl:output method="xml" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="animal"> 
    <xsl:param name="i" select="xxx[1]"/> 
    <xsl:variable name="thisanimal" select="."/> 
    <xsl:choose> 
     <xsl:when test="count(xxx) = 1"> 
      <!-- only one here --> 
      <xsl:copy-of select="."/> 
     </xsl:when> 
     <xsl:when test="$i = xxx[1]"> 
      <!-- more than one here, use the first --> 
      <xsl:copy> 
       <xsl:apply-templates select="*[name() != 'xxx']"/> 
       <xsl:apply-templates select="$i"/> 
      </xsl:copy> 
      <xsl:for-each select="xxx[position() &gt; 1]"> 
       <xsl:apply-templates select="$thisanimal"> 
        <xsl:with-param name="i" select="."/> 
       </xsl:apply-templates> 
      </xsl:for-each> 
     </xsl:when> 
     <xsl:otherwise> 
      <!-- more than one here --> 
      <xsl:copy> 
       <xsl:apply-templates select="*[name() != 'xxx']"/> 
       <xsl:apply-templates select="$i"/> 
      </xsl:copy> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

</xsl:transform> 
+0

danke @Stefan Hegny – Sowmiya

+0

froh zu helfen ... –

Verwandte Themen