[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

[xsl] creating nodes using multiple templates/modes


Subject: [xsl] creating nodes using multiple templates/modes
From: Rene Ladan <r.c.ladan@xxxxxxxxxxxxxx>
Date: Sun, 26 Mar 2006 22:38:35 +0200

Hi,

is it possible to create an output node (A) in XSLT 2.0 using one
template and use another template to add children (B) to this newly
created node?  The second template runs before node A is serialized to a
file.

I came up with the following XSLT 2.0 using Saxon 8.7.  This script
modifies a UML tree serialized as XMI 1.2 to create a node A ("Component
Specifications 23") using the default template and add node B (child
"vbMgr") to it using a template which runs in mode "convert-21to23".

<<END-OF-out-Data0.xsl

<xsl:stylesheet version="2.0">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="stereotype-id" match="UML:Stereotype" use="@..."/>
<!--most elements are inserted and applied recursively-->
-
	<xsl:template match="*">
-
	<xsl:copy>
<xsl:copy-of select="@*"/> <!-- this template creates node A ("Component
Specifications 23") -->
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
-
	<!--
This template matches any package with stereotype <<apply-function
{name=21to23}>>
-->
-
	<xsl:template match="UML:Package[key('stereotype-id',
@stereotype)/@name='apply-function' and
UML:ModelElement.taggedValue/UML:TaggedValue/UML:TaggedValue.dataValue='21to23']">
<xsl:apply-templates select="//*" mode="convert-21to23"/>
</xsl:template>
<!-- Prevent unwanted text nodes in output. -->
<xsl:template match="UML:Stereotype.baseClass |
UML:TaggedValue.dataValue" mode="convert-21to23"/>
-
	<!--
 Append UML code as child of package "Component Specifications 23", does
not work
-->
-
	<xsl:template match="UML:Package[@name='Component Specifications 23']"
mode="convert-21to23"> <!-- This template adds node B (class "vbMgr") as
a child node to node A ("Component Specifications 23") -->

	<!--
XXX this UML snippet is inserted at the "wrong" place.  It is also
inserted 7 times instead of once.
-->
-
	<UML:Namespace.ownedElement>
<UML:Class name="vbMgr" xmi.id="1.2.3.4"/>
</UML:Namespace.ownedElement>
</xsl:template>
</xsl:stylesheet>

END-OF-out-Data0.xsl

As the comment after the XXX says, I somehow expected that the class
"vbMgr" was added once as a child of package "Component Specifications
23", not seven (huh?) times as a child of "Business Type Model 21" (see
input file vb-in.xml and output file vb-uit.xml).

Maybe this behavior is caused by the fact that the second template does
not know that node A exists, as XSLT is more or less stateless/output-only.

Note that it is not possible to combine these two templates in the real
system of which this sample is extracted.  Therefore, this was the most
straightforward solution I could think of.

Suggestions?

Regards,
Rene

<<END-OF-vb-in.xml
<XMI xmi.version="1.2">
+
	<XMI.content>
-
	<UML:Model xmi.id="CID192.168.0.2471011e8833f41ae0d19e2"
name="vb-in-21to23">
-
	<UML:Namespace.ownedElement>
-
	<UML:Package xmi.id="_9_0_2_73d01a4_1133879809609_581459_3"
name="Specifications 2">
-
	<UML:Namespace.ownedElement>
-
	<UML:Package xmi.id="_9_0_2_73d01a4_1133879821953_597838_4"
name="Business Type Model 21">
-
	<UML:Namespace.ownedElement>
-
	<UML:Package xmi.id="_9_0_2_73d01a4_1133963341255_26742_1"
name="vb_21to23" stereotype="_9_0_2_73d01a4_1133880154328_588860_19">
-
	<UML:ModelElement.taggedValue>
-
	<UML:TaggedValue xmi.id="_9_0_2_73d01a4_1134557477265_151220_4"
name="name">
<UML:TaggedValue.dataValue>21to23</UML:TaggedValue.dataValue>
</UML:TaggedValue>
</UML:ModelElement.taggedValue>
-
	<UML:Namespace.ownedElement>
<UML:Class xmi.id="_9_0_2_73d01a4_1133881652140_906803_106" name="vb"/>
</UML:Namespace.ownedElement>
</UML:Package>
</UML:Namespace.ownedElement>
</UML:Package>
<UML:Package xmi.id="_9_0_2_73d01a4_1133879949906_3348_10"
name="Component Specifications 23"/>
</UML:Namespace.ownedElement>
</UML:Package>
-
	<UML:Stereotype xmi.id="_9_0_2_73d01a4_1133880154328_588860_19"
name="apply-function">
<UML:Stereotype.baseClass>Package</UML:Stereotype.baseClass>
-
	<UML:Stereotype.definedTag>
<UML:TagDefinition xmi.id="_9_0_2_73d01a4_1134557408428_137617_0"
name="name"/>
</UML:Stereotype.definedTag>
</UML:Stereotype>
</UML:Namespace.ownedElement>
</UML:Model>
</XMI.content>
</XMI>
END-OF-vb-in.xml

<<END-OF-vb-uit.xml
<XMI xmi.version="1.2">
-
	<XMI.content>
-
	<UML:Model xmi.id="CID192.168.0.2471011e8833f41ae0d19e2"
name="vb-in-21to23">
-
	<UML:Namespace.ownedElement>
-
	<UML:Package xmi.id="_9_0_2_73d01a4_1133879809609_581459_3"
name="Specifications 2">
-
	<UML:Namespace.ownedElement>
-
	<UML:Package xmi.id="_9_0_2_73d01a4_1133879821953_597838_4"
name="Business Type Model 21">
-
	<UML:Namespace.ownedElement>
-
	<UML:Namespace.ownedElement>
<UML:Class name="vbMgr" xmi.id="1.2.3.4"/>
</UML:Namespace.ownedElement>
-
	<UML:Namespace.ownedElement>
<UML:Class name="vbMgr" xmi.id="1.2.3.4"/>
</UML:Namespace.ownedElement>
-
	<UML:Namespace.ownedElement>
<UML:Class name="vbMgr" xmi.id="1.2.3.4"/>
</UML:Namespace.ownedElement>
-
	<UML:Namespace.ownedElement>
<UML:Class name="vbMgr" xmi.id="1.2.3.4"/>
</UML:Namespace.ownedElement>
-
	<UML:Namespace.ownedElement>
<UML:Class name="vbMgr" xmi.id="1.2.3.4"/>
</UML:Namespace.ownedElement>
-
	<UML:Namespace.ownedElement>
<UML:Class name="vbMgr" xmi.id="1.2.3.4"/>
</UML:Namespace.ownedElement>
-
	<UML:Namespace.ownedElement>
<UML:Class name="vbMgr" xmi.id="1.2.3.4"/>
</UML:Namespace.ownedElement>
</UML:Namespace.ownedElement>
</UML:Package>
<UML:Package xmi.id="_9_0_2_73d01a4_1133879949906_3348_10"
name="Component Specifications 23"/>
</UML:Namespace.ownedElement>
</UML:Package>
-
	<UML:Stereotype xmi.id="_9_0_2_73d01a4_1133880154328_588860_19"
name="apply-function">
<UML:Stereotype.baseClass>Package</UML:Stereotype.baseClass>
-
	<UML:Stereotype.definedTag>
<UML:TagDefinition xmi.id="_9_0_2_73d01a4_1134557408428_137617_0"
name="name"/>
</UML:Stereotype.definedTag>
</UML:Stereotype>
</UML:Namespace.ownedElement>
</UML:Model>
</XMI.content>
</XMI>
END-OF-vb-uit.xml

-- 
GPG fingerprint = 6793 FA71 C4E8 3BAD 5954  9552 F3DA D315 B8DB 03F5
(subkeys.pgp.net)

"It won't fit on the line."
		-- me, 2001


Current Thread
Keywords