[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] XSLT to convert to type substitution


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.

In my case there is a pattern between the original element name and the type name, where elmenet name of xx:Foo
will always map to type name of xx:FooType. I will try my limited XSL skills to see if I can figure out how to adapt
you XSLT so I need not have a mapping file and instead use the pattern above.


Thanks again. This community rock!

Florent Georges wrote:
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

Web: http://www.wellfleetsoftware.com


Current Thread
Keywords