Subject: Re: [xsl] priority of key patterns From: Ihe Onwuka <ihe.onwuka@xxxxxxxxx> Date: Wed, 14 Nov 2012 10:00:33 +0000 |
On Wed, Nov 14, 2012 at 8:48 AM, Michael Kay <mike@xxxxxxxxxxxx> wrote: > >> >> <xsl:template match="key('privateData','private')" priority="-0.1"> >> <private oldName="{local-name()}"> >> <xsl:apply-templates select="node()|@*"/> >> </private> >> </xsl:template> >> >> <xsl:template match="*|PayloadFile"> >> <xsl:element name="{local-name()}"> >> <xsl:apply-templates select="node()|@*"/> >> </xsl:element> >> > Your second template rule is rather peculiar, because the first alternative > (*) embraces the second (Payloadfile); except that they have different > priorities, so this is almost equivalent to writing a match="*" template > with priority -0.5, and a match=Payloadfile template with priority 0. Unless > there's another template rule with intervening priority, the second half of > the union is pointless. > No it's not pointless - see explanation below. > > Incidentally, I very rarely see key() used in patterns. I'd be interested to > know the use case. In XSLT 3.0 we're allowing a variable reference as a > pattern, so you can do for example > Here's the full stylesheet. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.xxxxx.com" version="2.0"> <xsl:import href="identity.xsl"/> <xsl:output indent="yes"/> <xsl:key name="privateData" match="*[@MetadataAccess]" use="@MetadataAccess"/> <xsl:template match="TMFFile"> <xsl:element name="{local-name()}"> <publicData> <xsl:apply-templates select="key('privateData','public')"/> </publicData> <privateData> <xsl:apply-templates select="key('privateData','private')"/> </privateData> </xsl:element> </xsl:template> <xsl:template match="key('privateData','private')" priority="-0.1"> <private oldName="{local-name()}"> <xsl:apply-templates select="node()|@*"/> </private> </xsl:template> <xsl:template match="*|PayloadFile"> <xsl:element name="{local-name()}"> <xsl:apply-templates select="node()|@*"/> </xsl:element> </xsl:template> </xsl:stylesheet> My instance is an iteration of heterogenous elements that have a metadataAccess attribute that classifies the element as either public or private. I want to rename all the private elements (except for PayloadFile) and copy the public elements unchanged. Additionally I want to congregate the public elements in a publicData wrapper and private elements in a privateData wrapper. I have used the key to get at all the private elements in preference to <private> <xsl:apply-templates select="//*[@MetadataAccess='private'] </private> but am probably not buying much by doing so. I agree that I could use <xsl:template match="*[@MetadataAccess='private']" priority="-0.1"> instead of the key in the match pattern. <xsl:template match="*|PayloadFile"> is necessary otherwise the previous template would snaffle PayloadFile that are private due to its higher priority over a * pattern. So yes I am deliberately exploiting the differing priorities of the union pattern to get the outcome I desire which is that private PayloadFile elements should be treated the same as public elements. Regarding other use cases for keys in patterns - I tend to do my renames like this <xsl:key name="mapNames" match="ren:*/@to" use="../@from"/> <xsl:variable name="renames"> <ren:element from="EmployeeCategory" to="Name"/> <ren:element from="PersonName" to="Name"/> <ren:element from="FormerlyKnown" to="Name"/> . . </xsl:variable> <xsl:template match="*[key('mapNames',name(),$renames)]"> <xsl:element name="{key('mapNames',name(),$renames)[1]}"> <xsl:apply-templates/> </xsl:element> </xsl:template>
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] priority of key patterns, Michael Kay | Thread | Re: [xsl] priority of key patterns, Andrew Welch |
Re: [xsl] priority of key patterns, Michael Kay | Date | Re: [xsl] priority of key patterns, Andrew Welch |
Month |