W3C home > Mailing lists > Public > xmlschema-dev@w3.org > February 2006

RE: How to consolidate multiple xsd files?

From: Michael Kay <mike@saxonica.com>
Date: Tue, 14 Feb 2006 12:27:19 -0000
To: <Daniel.Dui@ubs.com>, <xmlschema-dev@w3.org>
Message-ID: <E1F8zHN-0004J7-IK@maggie.w3.org>

Eliminating duplicates reached by following the several xsl:include's to the
same target is not difficult. Using XSLT 2.0, write a function that given an
xs:include, returns all the schema components in the included document
(expanded recursively, of course). Then use the XPath union operator ("|")
to remove the duplicates:

<xsl:function name="f:getComponents" as="element(*)">
  <xsl:param name="schemaDocument" as="element(xs:schema)"/>
  <xsl:sequence select="
     xs:element | xs:attribute | xs:complexType | xs:simpleType | ... |
     for $i in xs:include return
f:getComponents(document($i/@schemaLocation)/xs:schema)"/>
</xsl:function>

This works because XSLT gives you a guarantee that if you call document()
twice on the same absolute URI, you'll get the same nodes back each time,
which means that the union operator will eliminate duplicates.

Slightly more challenging is dealing with cyclic includes - it's not
entirely clear whether they are allowed or not, but they can happen.

There are other issues that can make merging difficult, for example if
elementFormDefault or other document-level attributes differ between an
including and an included schema document, then it's goinf to be quite
tricky to merge them.

Michael Kay
http://www.saxonica.com/

> -----Original Message-----
> From: xmlschema-dev-request@w3.org 
> [mailto:xmlschema-dev-request@w3.org] On Behalf Of Daniel.Dui@ubs.com
> Sent: 14 February 2006 11:45
> To: xmlschema-dev@w3.org
> Subject: How to consolidate multiple xsd files?
> 
> 
> xs dev
> 
> I have a schema defined in multiple xsd files that I would like to
> consolidate in a single xsd file. Is there any tool that does this? I
> would be surprised if no-one has written some xslt script for this.
> 
> In my case, I have the additional problem that multiple schemas share
> some xsd files.
> 
> For example:
> 
> schema_1.xsd
> schema_2.xsd
> schema_3.xsd
> shared_a.xsd
> 
> shared_a.xsd can contain complex type declarations used by 
> schema_1 and
> schema_2, but not by schema_3. 
> 
> When I generate a single xsd file for one schema, I would ideally like
> to pick up only the necessary complex type declarations, not just
> include the entire content of the shared xsd files.
> 
> I am not an XSLT guru. Having to develop this, I have the impression
> that the easier approach would be to do 2 or 3 processing steps that
> include more than it's necessary and then eliminate the 
> duplicates. Any
> thoughts?
> 
> many thanks
> 
> -daniel
> 
> 
> 
> 
> Visit our website at http://www.ubs.com
> 
> This message contains confidential information and is intended only 
> for the individual named.  If you are not the named addressee you 
> should not disseminate, distribute or copy this e-mail.  Please 
> notify the sender immediately by e-mail if you have received this 
> e-mail by mistake and delete this e-mail from your system.
> 
> E-mail transmission cannot be guaranteed to be secure or error-free 
> as information could be intercepted, corrupted, lost, destroyed, 
> arrive late or incomplete, or contain viruses.  The sender therefore 
> does not accept liability for any errors or omissions in the contents 
> of this message which arise as a result of e-mail transmission.  If 
> verification is required please request a hard-copy version.  This 
> message is provided for informational purposes and should not be 
> construed as a solicitation or offer to buy or sell any securities or 
> related financial instruments.
> 
> 
> 
> 
Received on Tuesday, 14 February 2006 12:27:44 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Tuesday, 11 January 2011 00:14:53 GMT