[xsl] creating attribute for xsl:element in applied template

Subject: [xsl] creating attribute for xsl:element in applied template
From: christoph.naber@xxxxxxxxxxx
Date: Mon, 21 Jul 2008 14:24:45 +0200
Hello,

Saxon 6.5, XSLT 1.0

assume following very simple schema

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema";>

        <xs:attribute name="id" type="xs:ID" />

        <xs:element name="parent">
                <xs:complexType>
                        <xs:sequence>
                                <xs:element ref="child" minOccurs="0"
maxOccurs="unbounded" />
                        </xs:sequence>
                </xs:complexType>
        </xs:element>

        <xs:element name="child" >
                <xs:complexType>
                        <xs:attribute ref="id" />
                </xs:complexType>
        </xs:element>

</xs:schema>

What I try to do now is to generate a sample XML file with XSLT. Therefore
I first create an xsl:element and then apply-templates on every
child-node. When some sub-structure happens to contain a xs:attribute, I'd
like to assign that attribute to the created xsl:element. This is not
possible, because the creation of xsl:attribute takes place in another
template than the creation of the xsl:element.

The XSLT I came up with so far:

<xsl:template match="xs:element[@ref]" >
        <xsl:apply-templates select="/xs:schema/xs:element[@name =
current()/@ref]" />
</xsl:template>

<xsl:template match="/xs:schema/xs:element[@name]" >
        <xsl:element name="{@name}">
                <xsl:apply-templates />
        </xsl:element>
</xsl:template>

<xsl:template match="xs:complexType" >
        <xsl:apply-templates select="xs:attribute" />
        <xsl:apply-templates select="*[not(self::xs:attribute)]" />
</xsl:template>

<xsl:template match="xs:attribute[@ref]" >
        <xsl:apply-templates select="/xs:schema/xs:attribute[@name =
current()/@ref]" />
</xsl:template>

<xsl:template match="/xs:schema/xs:attribute[@name]" >
        <xsl:attribute name="{@name}">
                <xsl:value-of select="@type" />
        </xsl:attribute>
</xsl:template>

Saxon sais: "Cannot write an attribute node when no element start tag is
open"

Is there no other way to accomplish this task than to create all
attribute-nodes directly in the "xs:element[@name]" - template? Would a
switch to XSLT 2.0 change something?


Greetings Christoph

If you are not the intended addressee, please inform us immediately that you
have received this e-mail in error, and delete it. We thank you for your
cooperation.

Current Thread