Hi,
I'm trying to automatically generate a schema using XSLT.
How can i please generate the attributes "targetNamespace="MyDoc" and
xmlns:my="MyDoc" as in the example:
----------------------------------------------------------------------------
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="MyDoc" xmlns:my="MyDoc" elementFormDefault="qualified">
----------------------------------------------------------------------------
Namespace declarations (attributes that start with xmlns) are not
really attributes, and you can't create them as if they were. Instead,
if a namespace is in-scope for the instruction that you use to create
an element, then a namespace declaration will usually be placed on the
element.
The easiest thing to do is just use a literal result element like:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="MyDoc" xmlns:my="MyDoc"
elementFormDefault="qualified">
...
</xsd:schema>
Usually, I'd put the namespace declarations that I want to appear in
the output on the <xsl:stylesheet> element, so something like:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:my="MyDoc">
<xsl:template match="/">
<xsd:schema targetNamespace="MyDoc"
elementFormDefault="qualified">
...
</xsd:schema>
</xsl:template>
</xsl:stylesheet>
That way, they remain in-scope throughout the stylesheet, which means
that you don't run into problems with namespace un-declarations.
Note that elements generated with <xsl:element> *don't* automatically
get namespace nodes for the namespaces that are in-scope for the
instruction. This is another reason to use literal result elements
instead of generating them with <xsl:element>.
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list