Hi all,
Here's hoping there's an obvious answer to this.
I need to generate minimal XSD schemas from data models that are
defined in XML documents. I've got everything working except one
little detail. I don't know how to reference the generated schema's
target namespace when I'm defining its elements' types.
Example: The generated schema defines one complexType named
"metadataSet". I want to create an xsd:element with that as its
type. In a normal xsd file I would declare a namespace xmlns:tns and
then set the element's type to "tns:metadataSet".
Here's the gotcha: I can't declare xmlns:tns up in the
<xsl:stylesheet> tag because parts of the namespace URI come from my
source XML file, which means that they are not available until I
start an <xsl:template> tag. Within the template, I construct the
namespace URI and store it as an xsl:param, but this doesn't help
much. XSL has this nifty setup with declaring namespaces for
elements and attributes, but these namespaces get extra little
inserts like xmlns:ns0 that only appear during the transform
process. This leaves me in the lurch because I need to reference
that namespace when I declare the vale of an attribute. As far as I
can tell, there is no way for my xsl document to know exactly what
that auto-generated namespace prefix will look like in the output
document. That would be fine if I only needed to append the prefix
to attribute and element names because I could basically ignore the
whole thing and let the processor handle it, but I need to put the
namespace prefix into the VALUE of a "type" attribute.
There's got to be either a way to:
1) programmatically reference the auto-generated namespace prefixes,
2) stop the processor from generating those little inserts in the
namespace prefixes, or
3) bypass the whole headache in some way that I didn't notice.
#####
# My XSL Document (Currently the metadataSet element's type is set
to "tns:metadataSet", but the tns prefix is not declared anywhere.
####
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:param name="targetNS">http://www.mediashelf.com/xsd/<xsl:value-
of select="metadataModel/@owner"/>/<xsl:value-of
select="metadataModel/@name"/></xsl:param>
<schema targetNamespace="{$targetNS}">
<complexType name="metadataSet">
<sequence>
<xsl:for-each select="metadataModel/metadataElement">
<element name="{@name}" type="{valueType}" xmlns="http://
www.w3.org/2001/XMLSchema"/>
</xsl:for-each>
</sequence>
</complexType>
<element name="metadataSet" type="tns:metadataSet"/>
</schema>
</xsl:template>
</xsl:stylesheet>
#####
# Example of the (ideal) schema that I want to generate:
####
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.mediashelf.com/xsd/MSHLF/myModel"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.mediashelf.com/xsd/MSHLF/myModel">
<complexType name="metadataSet">
<sequence>
<element type="xsd:string" name="myTextField"></element>
</sequence>
<attribute name="model" type="xsd:string"></attribute>
</complexType>
<element name="metadataSet" type="tns:metadataSet"></element>
</schema>
#####
# Example of the XML Files that get Transformed
####
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="SchemaFromModelDef.xsl"?>
<metadataModel name="myModel" owner="MSHLF"
xmlns:tns="http://www.mediashelf.com/xsd/ModelDefinitionSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.mediashelf.com/xsd/
ModelDefinitionSchema ModelDefinitionSchema.xsd ">
<metadataElement name="myTextField" type="tns:textfield">
<label>Text Field Label</label>
<description>Text Field Description</description>
<valueType>xsd:string</valueType>
<defaultValue>Enter something!</defaultValue>
<valuesUsedToDate>
<stringValue>"first value used"</stringValue>
<stringValue>"second value used"</stringValue>
</valuesUsedToDate>
</metadataElement>
</metadataModel>
Matt Zumwalt
matt.zumwalt@xxxxxxxxxxxxxxxxxx
917-687-8551
Visit http://www.yourmediashelf.com