Subject: RE: [xsl] Lookup question -- attempt 3 From: "Kienle, Steven C" <steven.c.kienle@xxxxxxxxxx> Date: Tue, 8 Jun 2004 17:11:36 -0400 |
The short answer is that in the following template. <xsl:template match="//T"> <xsl:apply-templates select="document('lookup.xml')//AB/pa[@prefnum=current()/pref]/*" mode="p"> <xsl:with-param name="id" select="@id" /> </xsl:apply-templates> <xsl:apply-templates select="*" /> </xsl:template> It does not create any output nodes. Therefore the p output nodes are all generated within the template for match="*" and mode="p". Hence the p nodes must all be closed prior to processing the current T input node's children. You can correct that by moving the first p output node into the match="T" template, and include the apply-templates inside of that p node. Of course, this looks slightly odd and requires that your lookup tree be of the following form: <pa prefnum="1"> <XXXX> <YYYY /> <ZZZZ /> </XXXX> </pa> and NOT: <pa prefnum="1"> <XXXX> <YYYY /> <ZZZZ /> </XXXX> <AAAA> <BBBB /> <CCCC /> </AAAA> </pa> Here is a transform which does pretty much all you want. I did use a global variable rather than opening the lookup document everywhere. <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes" /> <xsl:variable name="lookUp"> <xsl:copy-of select="document('lookup.xml')"/> </xsl:variable> <xsl:template match="/"> <Root> <xsl:apply-templates /> </Root> </xsl:template> <xsl:template match="T"> <xsl:variable name="nodeLookup"> <xsl:value-of select="name($lookUp/AB/pa[@prefnum=current()/pref]/*)"/> </xsl:variable> <xsl:variable name="newid" select="concat(translate(@id,' ','_'), 1)"/> <p c="{$nodeLookup}" id="{$newid}"> <xsl:apply-templates select="$lookUp/AB/pa[@prefnum=current()/pref]/*/*" mode="p"> <xsl:with-param name="id" select="$newid" /> </xsl:apply-templates> <xsl:apply-templates select="*"/> </p> </xsl:template> <xsl:template match="pref"></xsl:template> <xsl:template mode="p" match="*"> <xsl:param name="id">IDENTIFIER</xsl:param> <xsl:variable name="idd" select="translate($id,' ','_')"/> <xsl:variable name="newid" select="concat($idd, position())"/> <p c="{name()}" id="{$newid}"> <xsl:apply-templates mode="p" select="*"> <xsl:with-param name="id" select="$newid" /> </xsl:apply-templates> </p> </xsl:template> </xsl:stylesheet> Note that the number is slightly different, because I explicitly removed text nodes from the apply-templates processing stream. Steve LEGAL NOTICE Unless expressly stated otherwise, this message is confidential and may be privileged. It is intended for the addressee(s) only. Access to this E-mail by anyone else is unauthorized. If you are not an addressee, any disclosure or copying of the contents of this E-mail or any action taken (or not taken) in reliance on it is unauthorized and may be unlawful. If you are not an addressee, please inform the sender immediately.
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Lookup question -- attempt 3, Mir Farooq Ali | Thread | Re: [xsl] Lookup question -- attemp, Mir Farooq Ali |
Lookup question -- attempt 3, Mir Farooq Ali | Date | 3 level grouping, Nathan Shaw |
Month |