|
Subject: [xsl] Dynamic modes: A generic solution From: gutman@xxxxxxxxxxxxxxx Date: Mon, 6 Aug 2001 17:48:55 +0700 |
Hello, friends.
Suppose that we want every node with, say, a specific
namespace "x" be transformed in its own way, but with
another node as a context node (uniformly determined
by the node under transformation).
Here is a possible solution:
<xsl:template match="x:nameX">
<xsl:apply-templates select="new-context()"
mode="x:nameX"/>
</xsl:template>
<xsl:template match="context" mode="x:nameX">
nameX-specific code
</xsl:template>
where new-context() is an expression that,
according to the current node, returns a node list
with a single node whose name is "context".
This works, but, proceeding in this way, we have to
present an explicit extra template matched by x:nameX
for each node of type x:*.
If we might use AVTs as mode's values, we would write
a single template like this:
<xsl:template match="x:*">
<xsl:apply-templates select="new-context(.)"
mode="{name()}"/>
</xsl:template>
Alas, as is known, AVTs are not allowed there.
The problem is similar to that solved by generic templates.
So, let's consider a solution involving a "choose" operator:
<xsl:template match="x:*">
<xsl:for-each select="new-context(.)">
<xsl:choose>
<xsl:when test="local-name()='name1'">
name1-specific code
</xsl:when>
<xsl:when test="local-name()='name2'">
name2-specific code
</xsl:when>
...
</xsl:choose>
</xsl:for-each>
</xsl:template>
This is a "generic" analog:
<xsl:template match="x:*">
<xsl:call-template name="transform">
<xsl:with-param name="mode" select=
"document('')/*/y:*[local-name()=local-name(current())]"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="transform">
<xsl:param name="mode"/>
<xsl:apply-templates select="$mode">
<xsl:with-param name="context" select="new-context()"/>
</xsl:apply-templates>
</xsl:template>
Then, for each nameX, we can write the following:
<y:nameX/>
<xsl:template match="y:nameX">
<xsl:param name="context"/>
<xsl:for-each select="$context">
nameX-specific code
</xsl:for-each>
</xsl:template>
Not so bad. The only sad thing is that we have to insert
those xsl:param and xsl:for-each in each template.
I wonder if there exists a more adequate solution.
Any ideas?
--
Alexander E. Gutman
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| RE: [xsl]l "& #xA0; vs & #160;" ver, DPawson | Thread | [xsl] Re: Dynamic modes: A generic , gutman |
| RE: [xsl]l "& #xA0; vs & #160;" ver, DPawson | Date | RE: [xsl] Generic template for sele, Michael Kay |
| Month |