- From: <bugzilla@jessica.w3.org>
- Date: Wed, 12 May 2010 21:44:28 +0000
- To: public-qt-comments@w3.org
http://www.w3.org/Bugs/Public/show_bug.cgi?id=9722
--- Comment #3 from Evan Lenz <evan@evanlenz.net> 2010-05-12 21:44:28 ---
Dynamic access to mode names would give me a really ugly way to do what I
want... (see Example #2 below). But I think it would be so painful as to defeat
the purpose for me (especially since I can already pass a "mode name" via a
tunnel parameter at the original point of invocation).
What I'd really like to do is refer to the *previous* mode, both in
apply-templates and in match patterns.
So <xsl:apply-templates/> would now allow mode="#previous"
And <xsl:template> would now allow mode="myPreviousMode/myCurrentMode" -
limited to one separator ("/" as here or some other non-space, non-QName
character).
Thus every invocation of apply-templates is conceptually a conditional mode
invocation, parameterized by the current mode at the point of invocation. I can
think of several ways of modeling this (e.g., a mode can actually be a *pair*
of QNames, depending on whether its previous mode is ever referenced in the
stylesheet).
EXAMPLE #1 (with access to previous mode):
<!-- In stage 1, delete <foo>'s content -->
<xsl:template mode="stage1/content" match="foo"/>
<!-- In stage 3, add <bar/> after <bat/> -->
<xsl:template mode="stage3/after" match="bat">
<bar/>
</xsl:template>
<!-- The boilerplate code that enables me to write the above surgically precise
rules -->
<!-- By default, copy everything unchanged -->
<xsl:template mode="stage1
stage2
stage3" match="*">
<xsl:apply-templates mode="before" select="."/>
<xsl:copy>
<xsl:apply-templates mode="#current" select="@*"/>
<xsl:apply-templates mode="content" select="."/>
</xsl:copy>
<xsl:apply-templates mode="after" select="."/>
</xsl:template>
<!-- By default, process children -->
<xsl:template mode="content" match="*">
<xsl:apply-templates mode="#previous"/>
<!-- Processor knows statically that this will be either "stage1", "stage2",
or "stage3" -->
</xsl:template>
<!-- By default, don't add anything before or after -->
<xsl:template mode="before
after" match="*"/>
EXAMPLE #2 (achieving the same, using only current-mode()):
<!-- In stage 1, delete <foo>'s content -->
<xsl:template mode="stage1-content" match="foo"/>
<!-- In stage 3, add <bar/> after <bat/> -->
<xsl:template mode="stage3-after" match="bat">
<bar/>
</xsl:template>
<!-- The boilerplate code that enables me to write the above surgically precise
rules -->
<!-- By default, copy everything unchanged -->
<xsl:template mode="stage1
stage2
stage3" match="*">
<xsl:variable name="stage1" select="current-mode() eq 'stage1'"/>
<xsl:variable name="stage2" select="current-mode() eq 'stage2'"/>
<xsl:choose>
<xsl:when test="$stage1">
<xsl:apply-templates mode="stage1-before" select="."/>
</xsl:when>
<xsl:when test="$stage2">
<xsl:apply-templates mode="stage2-before" select="."/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates mode="stage3-before" select="."/>
</xsl:otherwise>
</xsl:choose>
<xsl:copy>
<xsl:apply-templates mode="#current" select="@*"/>
<xsl:choose>
<xsl:when test="$stage1">
<xsl:apply-templates mode="stage1-content" select="."/>
</xsl:when>
<xsl:when test="$stage2">
<xsl:apply-templates mode="stage2-content" select="."/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates mode="stage3-content" select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
<xsl:choose>
<xsl:when test="$stage1">
<xsl:apply-templates mode="stage1-after" select="."/>
</xsl:when>
<xsl:when test="$stage2">
<xsl:apply-templates mode="stage2-after" select="."/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates mode="stage3-after" select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- By default, process children -->
<xsl:template mode="stage1-content
stage2-content
stage3-content" match="*">
<xsl:choose>
<xsl:when test="current-mode() eq 'stage1-content'">
<xsl:apply-templates mode="stage1"/>
</xsl:when>
<xsl:when test="current-mode() eq 'stage2-content'">
<xsl:apply-templates mode="stage2"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates mode="stage3"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- By default, don't add anything before or after -->
<xsl:template mode="stage1-before
stage2-before
stage3-before
stage1-after
stage2-after
stage3-after" match="*"/>
Another way to look at this is that I want my XSLT processor to do the work of
automatically translating Example #1 into Example #2 for me, just as it already
does with mode="#current".
--
Configure bugmail: http://www.w3.org/Bugs/Public/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
Received on Wednesday, 12 May 2010 21:44:30 UTC