Friday, 15 June 2012

Simple XML Restructure with XSLT -



Simple XML Restructure with XSLT -

i'm new xslt , i'm trying accomplish reasonably simple restructure. have xml document representing person (for illustrative purposes). have numerous elements under person. these want extract first_name , last_name (and crucially others) new full_name element. i've seen question here. "renamewrapped" approach works. it's not generic plenty can't guarantee ordering of elements in input document.

i have next xml:

<?xml version="1.0" encoding="utf-8"?> <myname:person xmlns:myname="http://www.myname.co.uk/def"> <myname:attr1>some value</myname:attr1> <myname:first_name>john</myname:first_name> <myname:last_name>smith</myname:last_name> <myname:attr2>some value</myname:attr2> <!-- other person stuff --> </myname:person>

this transformed next xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform" xmlns:myname="http://www.myname.co.uk/def"> <xsl:output method="xml" indent="yes"/> <xsl:template match="@*|node()" name="identity"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="myname:person"> <myname:person> <xsl:copy> <xsl:apply-templates select="@*|node()[local-name() != 'first_name' , local-name() != 'person' , local-name() != 'last_name']"/> </xsl:copy> <myname:fullname> <xsl:apply-templates select="myname:first_name | myname:last_name"/> </myname:fullname> </myname:person> </xsl:template> </xsl:stylesheet>

however giving me next output myname:person beingness duplicated:

<?xml version="1.0" encoding="utf-8"?> <myname:person xmlns:myname="http://www.myname.co.uk/def"> <myname:person> <myname:attr1>some value</myname:attr1> <myname:attr2>some value</myname:attr2> </myname:person> <myname:fullname> <myname:first_name>john</myname:first_name> <myname:last_name>smith</myname:last_name> </myname:fullname> </myname:person>

what doing wrong?

thanks in advance help.

one of <myname:person> elements comes literal result element in template, other comes <xsl:copy>. if want

<?xml version="1.0" encoding="utf-8"?> <myname:person xmlns:myname="http://www.myname.co.uk/def"> <myname:attr1>some value</myname:attr1> <myname:attr2>some value</myname:attr2> <myname:fullname> <myname:first_name>john</myname:first_name> <myname:last_name>smith</myname:last_name> </myname:fullname> </myname:person>

then leave out <xsl:copy>, i.e.

<xsl:template match="myname:person"> <myname:person> <xsl:apply-templates select="@*|node()[local-name() != 'first_name' , local-name() != 'person' , local-name() != 'last_name']"/> <myname:fullname> <xsl:apply-templates select="myname:first_name | myname:last_name"/> </myname:fullname> </myname:person> </xsl:template>

or alternatively leave out explicit <myname:person>:

<xsl:template match="myname:person"> <xsl:copy> <xsl:apply-templates select="@*|node()[local-name() != 'first_name' , local-name() != 'person' , local-name() != 'last_name']"/> <myname:fullname> <xsl:apply-templates select="myname:first_name | myname:last_name"/> </myname:fullname> </xsl:copy> </xsl:template>

xml xslt

No comments:

Post a Comment