This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Identity Transform and Default Templates, I think...
- From: "Schneeman, Brent" <BSchneem at inovant dot com>
- To: "'XSL-List at lists dot mulberrytech dot com'" <XSL-List at lists dot mulberrytech dot com>
- Date: Wed, 19 Jun 2002 07:52:09 -0700
- Subject: Re: [xsl] Identity Transform and Default Templates, I think...
- Reply-to: xsl-list at lists dot mulberrytech dot com
Thanks to J.Pietschmann, David Carlisle, Mike Brown for responding. I really
appreciate it. (Mike, I hope all is well with you and yours with respect to
the fires)
I took the time to make an operational model, incorporating the changes
suggested. And I got it to work. Thanks.
Here's the original source document again:
<C3PO>
<BD id="foo">
<TR>
<RF>The Right Foot</RF>
<RK>The Right Knee</RK>
<HR>The Heart</HR>
<Ext id="bar"><ANewLimb>Some new Limb</ANewLimb></Ext>
</TR>
</BD>
</C3PO>
Here's the updated and operational XSL (it imports the canonical copy
transform (e.g. identity transform)):
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<!--from http://www.dpawson.co.uk/xsl/sect2/identity.html#d142e45-->
<xsl:import href="./identity.xsl"/>
<xsl:output indent="yes"/>
<!-- the C3PO template -->
<xsl:template match="C3PO">
<!-- convert C3PO to SeeThreePO -->
<SeeThreePO>
<!-- select the BD element -->
<xsl:apply-templates select="BD"/>
</SeeThreePO>
</xsl:template>
<!--BD Template -->
<xsl:template match="BD">
<!-- output Body element -->
<Body id="{@id}">
<xsl:apply-templates select="TR"/>
</Body>
</xsl:template>
<xsl:template match="TR">
<Torso>
<Chest>
<xsl:apply-templates select="HR"/>
</Chest>
<RightLeg>
<xsl:apply-templates select="RF"/>
<xsl:apply-templates select="RK"/>
</RightLeg>
<xsl:apply-templates select="Ext"/>
</Torso>
</xsl:template>
<xsl:template match="Ext">
<Extension id="{@id}">
<!--pickup any sub elements, using the identity transform-->
<xsl:apply-templates/>
</Extension>
</xsl:template>
<xsl:template match="HR">
<Heart>
<xsl:apply-templates/>
</Heart>
</xsl:template>
<xsl:template match="RF">
<RightFoot>
<xsl:apply-templates/>
</RightFoot>
</xsl:template>
<xsl:template match="RK">
<RightKnee>
<xsl:apply-templates/>
</RightKnee>
</xsl:template>
</xsl:stylesheet>
Identity.xsl looks like this:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<!-- The identity Transform -->
<!-- Whenever you match any node or any attribute -->
<xsl:template match="node()|@*">
<!-- Copy the current node -->
<xsl:copy>
<!-- Including any attributes it has and any child nodes -->
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Applying the XSL to the XML generates this output (pretty printed):
<SeeThreePO>
<Body id="foo">
<Torso>
<Chest>
<Heart>The Heart</Heart>
</Chest>
<RightLeg>
<RightFoot>The Right Foot</RightFoot>
<RightKnee>The Right Knee</RightKnee>
</RightLeg>
<Extension id="bar">
<ANewLimb>Some new Limb</ANewLimb>
</Extension>
</Torso>
</Body>
</SeeThreePO>
That all works like a champ. (I used XALAN's built-in Process class to do
this)
Now, I want to transform this document:
<C3PO>
<SOUL>The Soul</SOUL>
<BD id="foo">
<HEAD>The Head</HEAD>
<TR>
<RF>The Right Foot</RF>
<RK>The Right Knee</RK>
<HR>The Heart</HR>
<Ext id="bar"><ANewLimb>Some new Limb</ANewLimb></Ext>
</TR>
</BD>
</C3PO>
and make sure that the SOUL and HEAD elements are copied. If I take the
suggestion to replace only the <xsl:apply-templates select"xxx"> elements
within the C3PO and BD templates with <xsl:apply-templates/>, I get the SOUL
and HEAD:
<SeeThreePO>
<SOUL>The Soul</SOUL>
<Body id="foo">
<HEAD>The Head</HEAD>
<Torso>
<Chest>
<Heart>The Heart</Heart>
</Chest>
<RightLeg>
<RightFoot>The Right Foot</RightFoot>
<RightKnee>The Right Knee</RightKnee>
</RightLeg>
<Extension id="bar">
<ANewLimb>Some new Limb</ANewLimb>
</Extension>
</Torso>
</Body>
</SeeThreePO>
Victory! Now I need to apply the lesson to the actual application. Thanks
bunches.
Note that if I globally replace the <xsl:apply-templates select"xxx"> with
<xsl:apply-templates/>, the output winds up with an extra RightFoot and
RightKnee in the Chest along with the Heart, and an extra Heart in the
RightLeg.
Regards,
-Brent Schneeman
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list