Subject: [xsl] xsl:apply-imports behavior wrong in Saxon? From: "Bob Stayton" <bobs@xxxxxxxxxxxx> Date: Thu, 4 Apr 2013 09:10:18 -0700 |
I'm processing this simple document book.xml: ---------------------------------------------------------------------------------------------------------------------------- <?xml version="1.0" encoding="UTF-8"?> <book> <title>My book title</title> <para>My first para</para> </book> ----------------------------------------------------------------------------------------------------------------------------
with this stylesheet (modetest.xsl): ---------------------------------------------------------------------------------------------------------------------------- <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="book"> <xsl:apply-templates select="." mode="inside_mode"/> </xsl:template>
<xsl:template match="book" mode="inside_mode"> <xsl:choose> <xsl:when test="$myflag != 0"> <xsl:message>Reached apply-imports in modetest.xsl</xsl:message> <xsl:apply-imports/> </xsl:when> <xsl:otherwise> <xsl:message>Reached otherwise in modetest.xsl</xsl:message> </xsl:otherwise> </xsl:choose> </xsl:template>
<xsl:template match="*" mode="inside_mode"> <xsl:message>reached fallback in modetest.xsl for element <xsl:value-of select="local-name()"/></xsl:message> </xsl:template>
</xsl:stylesheet> ----------------------------------------------------------------------------------------------------------------------------
And the imported no-mode.xsl stylesheet is: ---------------------------------------------------------------------------------------------------------------------------- <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="book"> <xsl:choose> <xsl:when test="$myflag != 0"> <xsl:message>Reached when in no_mode.xsl</xsl:message> <xsl:apply-imports/> </xsl:when> <xsl:otherwise> <xsl:message>Reached otherwise in no_mode.xsl</xsl:message> </xsl:otherwise> </xsl:choose> </xsl:template>
</xsl:stylesheet> ----------------------------------------------------------------------------------------------------------------------------
When I apply modetest.xsl to book.xml using xsltproc, the message output is just:
Reached apply-imports in modetest.xsl reached fallback in modetest.xsl for element title reached fallback in modetest.xsl for element para
According to Saxon author Michael Kay's website, his description of xsl:apply-imports is:
"The effect is to search for a template that matches the current node and that is defined in a stylesheet that was imported (directly or indirectly, possibly via xsl:include) from the stylesheet containing the current template, and whose mode matches the current mode. If there is such a template, it is activated using the current node. If not, the call on xsl:apply-imports has no effect."
There is no template matching on book in mode="inside_mode" in the imported stylesheet, so the call on xsl:apply-imports should have no effect. That is what I see when I process with xsltproc. However, Saxon continues processing the children of book in that mode, even though there is no xsl:apply-templates to trigger such processing. Why is Saxon applying templates in mode="inside_mode" to the children of book?
Bob Stayton Sagehill Enterprises bobs@xxxxxxxxxxxx
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] xpath 2 regex, davep | Thread | Re: [xsl] xsl:apply-imports behavio, G. Ken Holman |
Re: [xsl] xpath 2 regex, davep | Date | Re: [xsl] xsl:apply-imports behavio, G. Ken Holman |
Month |