zido71
zido71

Reputation: 33

XSLT - Rename and move elements to a new node

I have the following XML input file:

<home>
    <folders>
        <folder uuid="uuid1">
            <name>folder1</name>
            <member ref="refA" />
            <member ref="refB" />
        </folder>
        <folder uuid="uuid2">
            <name>folder2</name>
            <member ref="refC" />
            <member ref="refD" />
        </folder>
        <folder uuid="uuid3">
            <name>folder3</name>
            <member ref="refE" />
            <member ref="refF" />
        </folder>
    </folders>
</home>

And I would have the following tree:

<home>
    <folders>
        <folder uuid="uuid1">
            <name>folder1</name>
            <refNews>
                <refNew ref="refA" />
                <refNew ref="refB" />
            </refNews>
        </folder>
        <folder uuid="uuid2">
            <name>folder2</name>
            <refNews>
                <refNew ref="refC" />
                <refNew ref="refD" />
            </refNews>
        </folder>
        <folder uuid="uuid3">
            <name>folder3</name>
            <refNews>
                <refNew ref="refE" />
                <refNew ref="refF" />
            </refNews>
        </folder>
    </folders>
</home>

To resume :

I try several XSLT templates but I can't rename and move in the same XSLT file :-(

I need your help, please.

Regards, Zido

Upvotes: 0

Views: 338

Answers (1)

Flynn1179
Flynn1179

Reputation: 12075

It's always better to see what you have so far and help fix where it's going wrong, but this is actually quite easy. Try this:

<xsl:template match="folder">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()[not(self::member)]"/>
    <refNews>
      <xsl:apply-templates select="member"/>
    </refNews>
  </xsl:copy>
</xsl:template>

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

If you don't want a refNews element if there aren't any members, you can just wrap the refNews element in <xsl:if test="member"/>, or better yet, have the first template to match folder[member].

This assumes you also have the identity template defined.

Upvotes: 1

Related Questions