|
next
|
 Subject: XQuery to consolidate modular XML Schemas - any help? Author: (Deleted User) Date: 09 Dec 2004 05:42 AM
|
Hi David,
here is a query that you can use as a starting point. It will import the
definitions that are in an included file (not definitions coming from an
imported file, as those would be in a different namespace and a single
xsd:schema has just one targetNamespace). One of the limitations this
query has is that it will look just one level deep (e.g. it will not
import definitions coming from a schema included by an included schema).
Hope this helps,
Alberto
declare namespace xsd = "http://www.w3.org/2001/XMLSchema";
declare variable $schema := doc("ipo.xsd")/xsd:schema;
declare variable $includeSet := $schema/xsd:include;
declare variable $toProcess := $schema/(* except xsd:include);
declare function local:search(
$typeToSearch as xs:string,
$node as element(),
$qNameToSearch as xs:string) as element()?
{
let $prefix:=substring-before($qNameToSearch,":"),
$name:=substring-after($qNameToSearch,":")
for $include in $includeSet
return
if(namespace-uri-for-prefix($prefix,$node) eq $schema/@targetNamespace)
then
if(exists($include/@schemaLocation))
then (
let $includedSchema:=doc($include/@schemaLocation)/xsd:schema
return $includedSchema/xsd:*[local-name()=$typeToSearch][@name=$name]
)
else ()
else ()
};
declare function local:navigateElement($node as element(xsd:element)) as element()?
{
if(exists($node/@type))
then
let $a := local:search("complexType", $node, $node/@type)
return if(empty($a))
then local:search("simpleType", $node, $node/@type)
else $a
else
if(exists($node/@ref))
then local:search("element", $node, $node/@ref)
else local:includeReferencedDefs($node/*)
};
declare function local:navigateAttribute($node as element()) as element()?
{
if(exists($node/@type))
then local:search("simpleType", $node, $node/@type)
else
if(exists($node/@ref))
then local:search("attribute", $node, $node/@ref)
else local:includeReferencedDefs($node/*)
};
declare function local:navigateGroup($node as element()) as element()?
{
if(exists($node/@ref))
then local:search("group", $node, $node/@ref)
else local:includeReferencedDefs($node/*)
};
declare function local:navigateAttributeGroup($node as element()) as element()?
{
if(exists($node/@ref))
then local:search("attributeGroup", $node, $node/@ref)
else local:includeReferencedDefs($node/*)
};
declare function local:navigateSimpleType($node as element()) as element()?
{
if(exists($node/@base))
then local:search("simpleType", $node, $node/@base)
else local:includeReferencedDefs($node/*)
};
declare function local:navigateComplexType($node as element()) as element()?
{
if(exists($node/@base))
then
let $a := local:search("complexType", $node, $node/@base)
return if(empty($a))
then local:search("simpleType", $node, $node/@base)
else $a
else local:includeReferencedDefs($node/*)
};
declare function local:includeReferencedDefs($nodes as element()*) as element()*
{
for $node in $nodes
return
typeswitch($node)
case element(xsd:element) return local:navigateElement($node)
case element(xsd:attribute) return local:navigateAttribute($node)
case element(xsd:group) return local:navigateGroup($node)
case element(xsd:attributeGroup) return local:navigateAttributeGroup($node)
case element(xsd:simpleType) return local:navigateSimpleType($node)
case element(xsd:complexType) return local:navigateComplexType($node)
default return local:includeReferencedDefs($node/*)
};
<xsd:schema>
{
$schema/@*,
$toProcess,
local:includeReferencedDefs($toProcess/*) except $toProcess
}
</xsd:schema>
|
|
|
|