Altova Mailing List Archives>Archive Index >microsoft.public.xsl Archive Home >Recent entries >Thread Prev - Performance referencing global parameter data >Thread Next - Re: Performance referencing global parameter data Re: Performance referencing global parameter dataTo: NULL Date: 1/3/2007 11:55:00 AM
<richard.collette@g...> wrote in message
news:1167847756.234534.79320@h......
> To the best of my knowledge, there is no way in XSL 1.0 to key values
> passed in a global parameter since xsl:key will not accept variables.
> So I am left with the worst performing aspect of my xsl being lookups
> to parameterized configuration information which looks like:
>
> <xsl:param name="config">
> <documentType miscControlAttributes="">
> <itemName miscControlAttributes=""/>
> <itemName2 miscControlAttributes=""/>
> </documentType>
> </xsl:param>
>
> The configuration is then stored as a nodeset
> <xsl:variable name="configuration-nodeset"
> select="msxsl:node-set($configuration)"/>
This is not necessary for static (not dynamically generated parameters). One
can simply write:
<xsl:variable name="configuration-nodeset"
select="document('')/*/xsl:param[@name='config'"/>
>
> For each documentType node in the input, I retrieve the document level
> configuration into a variable:
> <xsl:variable name="documentConfiguration"
> select="$configuration-nodeset/*[translate(name(), $lc,
> $uc)=translate(current()/@form,$lc,$uc)]"/>
>
> The document nodes are, unfortunately, case insensitive coming from the
> source, so I have to perform a translation to upper case for
> comparison.
>
> The template for processing document items is called, passing in the
> document configuration
> <xsl:apply-templates select="*">
> <xsl:with-param name="documentConfiguration"
> select="$documentConfiguration"/>
> </xsl:apply-templates>
>
> The document item template then does a lookup to the item configuration
> <xsl:template match="d:item">
> <xsl:param name="documentConfiguration"/>
> <xsl:variable name="itemConfiguration"
> select="$documentConfiguration/*[translate(name(),$lc,$uc)=translate($normalizedElementName,$lc,$uc)]"/>
> </xsl:template>
>
> Does anyone know of a better pattern for looking up parameterized
> configuration info that is compatible with XSL 1.0?
>
The key() function operates on the current document. This means that xsl:key
can be used to index any document, including a dynamically created one.
This design pattern is well known and can be implemented as in the example
below:
<xsl:for-each select="<root-node-of-some-document"> <!-- makes
<some-document> the current document -->
<xsl:for-each select="key('some-key', <some-value>)"> <!-- Creates an
index for the given key the first time it is referenced by a key() function
for the current document -->
<!-- do whatever is necessary with each node selected by the key()
function -->
</xsl:for-each>
</xsl:for-each>
For more examples do have a look at:
http://dpawson.co.uk/xsl/sect2/N4852.html#d5954e181
and generally at:
http://dpawson.co.uk/xsl/sect2/N4852.html
Hope this helped.
Cheers,
Dimitre Novatchev
| ||||||
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | Mobile | Full Site | |||
|
