Tuesday 15 May 2012

xml - Moving nodes down using XSLT -



xml - Moving nodes down using XSLT -

after puting question here, managed move node (moving nodes using xslt). after thought understood tried opposite move node down. didn't work. did:

my input info called debtors.xml:

<?xml version="1.0" ?> <eexact xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:nonamespaceschemalocation="eexact-schema.xsd"> <accounts> <account code=" 001" status="a" type="c"> <name>name</name> <contacts> <contact default="1" gender="m" status="a"> <note>patient: 1</note> <firstname></firstname> <addresses> <address type="d" desc=""> <addressline1>street</addressline1> <addressline2></addressline2> <addressline3></addressline3> <postalcode>0000 aa</postalcode> <city>&apos;city</city> <country code="nl"/> <phone></phone> <fax></fax> </address> </addresses> <language code="nl"/> <jobdescription>--</jobdescription> <phone></phone> <phoneext></phoneext> <fax></fax> <mobile></mobile> <email></email> <webaccess>0</webaccess> </contact> </contacts> <debtor number=" 1" code=" 1"> <currency code="eur"/> </debtor> </account> </accounts> </eexact>

my xsl called test2.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <!-- indentation in xsl --> <xsl:output method="xml" version="1.0" omit-xml-declaration="yes" encoding="utf-8" indent="yes"/> <!-- removing blank lines in xsl --> <xsl:strip-space elements="*"/> <!-- identity rule --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()" /> </xsl:copy> </xsl:template> <!-- special rules ... --> <xsl:template match="account"> <xsl:copy> <!-- exclude name --> <xsl:apply-templates select="@* | node()[not(self::name)]"/> </xsl:copy> </xsl:template> <xsl:template match="contacts"> <xsl:copy> <!-- include name --> <xsl:apply-templates select="@* | node() | contact/name"/> </xsl:copy> </xsl:template> </xsl:stylesheet>

wanted output:

<?xml version="1.0" ?> <eexact xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:nonamespaceschemalocation="eexact-schema.xsd"> <accounts> <account code=" 001" status="a" type="c"> <contacts> <contact default="1" gender="m" status="a"> <name>name</name> <note>patient: 1</note> <firstname></firstname> <addresses> <address type="d" desc=""> <addressline1>street</addressline1> <addressline2></addressline2> <addressline3></addressline3> <postalcode>0000 aa</postalcode> <city>&apos;city</city> <country code="nl"/> <phone></phone> <fax></fax> </address> </addresses> <language code="nl"/> <jobdescription>--</jobdescription> <phone></phone> <phoneext></phoneext> <fax></fax> <mobile></mobile> <email></email> <webaccess>0</webaccess> </contact> </contacts> <debtor number=" 1" code=" 1"> <currency code="eur"/> </debtor> </account> </accounts> </eexact>

my problem xsl node "name" deleted, doesn't come kid of contact. hope help me?

i'd recommend few changes:

to suppress name, add together template rule matches nothing. to add together name contact, add together template rule matches contact , copies usual inserts name. eliminate template matching contacts (plural); general identity rule can handle fine.

here's finish stylesheet updated mentioned:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <!-- indentation in xsl --> <xsl:output method="xml" version="1.0" omit-xml-declaration="yes" encoding="utf-8" indent="yes"/> <!-- removing blank lines in xsl --> <xsl:strip-space elements="*"/> <!-- identity rule --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()" /> </xsl:copy> </xsl:template> <!-- special rules ... --> <xsl:template match="name"/> <xsl:template match="contact"> <xsl:copy> <!-- include name --> <xsl:apply-templates select="@*"/> <name><xsl:value-of select="../../name"/></name> <xsl:apply-templates select="node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>

given sample input xml, above xslt produces requested output xml:

<eexact xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:nonamespaceschemalocation="eexact-schema.xsd"> <accounts> <account code=" 001" status="a" type="c"> <contacts> <contact default="1" gender="m" status="a"> <name>name</name> <note>patient: 1</note> <firstname/> <addresses> <address type="d" desc=""> <addressline1>street</addressline1> <addressline2/> <addressline3/> <postalcode>0000 aa</postalcode> <city>'city</city> <country code="nl"/> <phone/> <fax/> </address> </addresses> <language code="nl"/> <jobdescription>--</jobdescription> <phone/> <phoneext/> <fax/> <mobile/> <email/> <webaccess>0</webaccess> </contact> </contacts> <debtor number=" 1" code=" 1"> <currency code="eur"/> </debtor> </account> </accounts> </eexact>

xml xslt

No comments:

Post a Comment