Subject: Re: [xsl] XSLT to convert to type substitution From: Farrukh Najmi <farrukh@xxxxxxxxxxxxxxxxxxxxx> Date: Sun, 02 Dec 2007 20:27:56 -0500 |
Thank you so very much Florent for helping me out :-) I am trying it out now.
Farrukh Najmi wrote:
Hi
I have an XML Schema that is being changed to use type
substitution instead of substitutionGroups (element
substitution).
I was wondering if any one can share an XSLT sample that
would convert according to examples of old and new
document below...
Provided you have a mapping document like the following:
<mapping xmlns:xx="xx-uri"> <xx:Element1 xx:Element1="type" xx:Object="elem"/> <xx:Element2 xx:Element2="type" xx:Object="elem"/> </mapping>
you can use the Modified Identity pattern as following. Take care to correctly handle the namespace bindings.
Regards,
--drkm
Welcome to the Emacs shell
~/xslt/tests $ cat farrukh.xml <xx:Objects xmlns:xx="xx-uri">
<xx:Element1>
...
</xx:Element1>
<xx:Element2>
...
</xx:Element2>
</xx:Objects>
~/xslt/tests $ cat farrukh-mapping.xml <mapping xmlns:xx="xx-uri">
<xx:Element1 xx:Element1="type" xx:Object="elem"/>
<xx:Element2 xx:Element2="type" xx:Object="elem"/>
</mapping>
~/xslt/tests $ cat farrukh.xsl <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:my="my:farrukh.xsl"
exclude-result-prefixes="xs my"
version="2.0">
<xsl:variable name="mapping" as="element()+" select=" document('farrukh-mapping.xml')/mapping/*"/>
<xsl:function name="my:name-mapping" as="element()?"> <xsl:param name="elem" as="element()"/> <xsl:sequence select=" $mapping[node-name(.) eq node-name($elem)]"/> </xsl:function>
<xsl:template match="node()"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates select="node()"/> </xsl:copy> </xsl:template>
<xsl:template match="/*"> <xsl:copy> <xsl:namespace name="xsi" select=" 'http://www.w3.org/2001/XMLSchema-instance'"/> <xsl:copy-of select="@*"/> <xsl:apply-templates select="node()"/> </xsl:copy> </xsl:template>
<xsl:template match="*[my:name-mapping(.)]"> <xsl:variable name="m" as="element()" select=" my:name-mapping(.)"/> <xsl:variable name="e" as="xs:QName" select=" $m/@*[. eq 'elem']/node-name(.)"/> <xsl:variable name="t" as="xs:QName" select=" $m/@*[. eq 'type']/node-name(.)"/> <xsl:element name="{ $e }" namespace="{ namespace-uri-from-QName($e) }"> <xsl:namespace name="{ prefix-from-QName($t) }" select="namespace-uri-from-QName($t)"/> <xsl:attribute name="xsi:type"> <xsl:value-of select="$t"/> </xsl:attribute> <xsl:copy-of select="@*"/> <xsl:apply-templates select="node()"/> </xsl:element> </xsl:template>
</xsl:stylesheet>
~/xslt/tests $ saxon farrukh.xml farrukh.xsl <?xml version="1.0" encoding="UTF-8"?><xx:Objects xmlns:xx="xx-uri" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <xx:Object xsi:type="xx:Element1"> ... </xx:Object> <xx:Object xsi:type="xx:Element2"> ... </xx:Object> </xx:Objects>
-- Regards, Farrukh Najmi
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] XSLT to convert to type s, Florent Georges | Thread | Re: [xsl] XSLT to convert to type s, Florent Georges |
Re: [xsl] Issue with nested groupin, Geert Bormans | Date | Re: [xsl] Dumb Question - XML to XM, Andrew Welch |
Month |