At 2004-04-05 08:55 -0700, Gary Fix wrote:
Here's my input xml:
...
<ClaimsPartyInfo>
<ClaimsPartyRoleCd>VEH</ClaimsPartyRoleCd>
<ClaimsPartyRoleCd>DRV</ClaimsPartyRoleCd>
<ClaimsPartyLocCd>INSVEH</ClaimsPartyLocCd>
...
and my xsl:
...
<xsl:template
match="ClaimsSvcRq/ClaimsNotificationAddRq/ClaimsParty/ClaimsPartyInfo[descendant::ClaimsPartyRoleCd='VEH'
and descendant::ClaimsPartyLocCd='INSVEH']">
<xsl:element name="OwnerName">
<xsl:call-template name="GetName"/>
</xsl:element>
</xsl:template>
<xsl:template
match="ClaimsSvcRq/ClaimsNotificationAddRq/ClaimsParty/ClaimsPartyInfo[descendant::ClaimsPartyRoleCd='DRV'
and descendant::ClaimsPartyLocCd='INSVEH']">
<xsl:element name="DriverName">
<xsl:call-template name="GetName"/>
</xsl:element>
</xsl:template>
Both of the above template rules match the same <ClaimsPartyInfo> element.
Pushing the ClaimsPartyInfo element with an <xsl:apply-templates> will
trigger a "template conflict", which the XSLT Recommendation describes as
an error.
what the transform looks like:
<?xml version="1.0" encoding="UTF-8"?>
<UdtFNOLArray>
<VehicleData>
<DriverName>C J Pounder III & Brock Pounde</DriverName>
<DriverName>C J Pounder III & Brock Pounde</DriverName>
</VehicleData>
</UdtFNOLArray>
Right ... because the same template rule is being fired for the same node
in both cases.
and what it should look like:
<?xml version="1.0" encoding="UTF-8"?>
<UdtFNOLArray>
<VehicleData>
<OwnerName>C J Pounder III & Brock Pounde</DriverName>
<DriverName>C J Pounder III & Brock Pounde</DriverName>
</VehicleData>
</UdtFNOLArray>
How do you want to distinguish the two template rules since they both match
the same node? When you figure out what the distinction is, you will be
able to change your match accordingly.
The Driver element gets repeated.
Right ... as I would expect when both template rules match the one node.
If I switch locations of the Owner and Driver xsl sections, the Owner gets
repeated. I'm thinking this is do to similar templates having only the
"descendant::ClaimsPartyRoleCd='VEH'" being different and the last one "wins".
Not quite, it is because both template rules match the one node and your
processor is not reporting template conflict rule errors so is, by
specification, using only the latter in document order of the stylesheet of
all template rules that match.
But I'm having difficulty coming up with a different method that works.
You will have to establish the criteria and use either modes or priority.
For example, using modes:
<xsl:template match="ClaimsPartyInfo" mode="do-owner-stuff">
...
</xsl:template>
<xsl:template match="ClaimsPartyInfo" mode="do-driver-stuff">
...
</xsl:template>
...
<xsl:apply-templates mode="do-owner-stuff" select="..."/>
<xsl:apply-templates mode="do-driver-stuff" select="..."/>
If the determination is by other criteria in your source tree, use priority
instead.
The above techniques remove the template conflict, so there isn't an error.
But, you shouldn't be developing using a processor that doesn't report
template conflicts. I advise all of my students that during development
they should always use an XSLT processor that reports template
conflicts. Consider the situation where you write the above stylesheet and
it just happens to do what you want because of the fallback behaviour ...
you ship it to your customer ... your customer happens to be using an XSLT
processor that reports template conflicts and abends ... all of a sudden
your "working" stylesheet does not work (spectacularly!) for your customer.
I hope this helps.
.......................... Ken
--
Public courses: Spring 2004 world tour of hands-on XSL instruction
Each week: Monday-Wednesday: XSLT/XPath; Thursday-Friday: XSL-FO
Hong Kong May 17-21; Bremen Germany May 24-28; Helsinki June 14-18
World-wide on-site corporate, govt. & user group XML/XSL training.
G. Ken Holman mailto:gkholman(_at_)CraneSoftwrights(_dot_)com
Crane Softwrights Ltd. http://www.CraneSoftwrights.com/s/
Box 266, Kars, Ontario CANADA K0A-2E0 +1(613)489-0999 (F:-0995)
Male Breast Cancer Awareness http://www.CraneSoftwrights.com/s/bc