[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: Florent Georges <lists@xxxxxxxxxxxx>
Date: Mon, 3 Dec 2007 00:37:56 +0100 (CET)
Re:  XSLT to convert to type substitution
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>

~/xslt/tests $ 























      _____________________________________________________________________________ 
Ne gardez plus qu'une seule adresse mail ! Copiez vos mails vers Yahoo! Mail 

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.