[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: XSLT to convert to type substitution

Subject: Re: XSLT to convert to type substitution
From: Farrukh Najmi <farrukh@xxxxxxxxxxxxxxxxxxxxx>
Date: Sun, 02 Dec 2007 20:27:56 -0500
Re:  XSLT to convert to type substitution
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

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.