Thanks for sharing the example. I further tested the program as following:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://xsl/stack"
version="2.0">
<xsl:output method="text" />
<xsl:template match="/">
<!-- 1. --> <xsl:variable name="stack" select="()" />
<!-- 2. --> <xsl:variable name="stack" select="x:push($stack, 1)" />
<!-- 3. --> <xsl:value-of select="x:top($stack)" />
<!-- 4. --> <xsl:variable name="stack" select="x:push($stack, 2)" />
<!-- 5. --> <xsl:value-of select="x:top($stack)" />
<!-- 6. --> <xsl:value-of select="x:top(x:pop($stack))" />
</xsl:template>
<xsl:function name="x:push" as="item()+">
<xsl:param name="stack" as="item()*"/>
<xsl:param name="item" as="item()"/>
<xsl:sequence select="$item, $stack"/>
</xsl:function>
<xsl:function name="x:pop" as="item()*">
<xsl:param name="stack" as="item()*"/>
<xsl:sequence select="remove($stack, 1)"/>
</xsl:function>
<xsl:function name="x:top" as="item()?">
<xsl:param name="stack" as="item()*"/>
<xsl:sequence select="$stack[1]"/>
</xsl:function>
</xsl:stylesheet>
I get the output:
121
I am happy with this; but have following questions:
1) On this line <!-- 2. --> , I create a variable 'stack'. This is a
new *variable* and not the old one (on line <!-- 1. -->; because we
cannot modify variables in XSLT). This doesn't make me quite happy :)
2) On line <!-- 6. -->, I do x:top(x:pop($stack)). This modifies a
transient stack, and doesn't modify the variable $stack. I would like
the variable $stack to be modified. But that's not possible, we know
:)
I guess, these limitations will prohibit some stack specific programs
to be built.
Can we think of some strategies to overcome these limitations.
On Wed, Feb 20, 2008 at 9:19 PM, Florent Georges
<lists(_at_)fgeorges(_dot_)org> wrote:
<xsl:function name="x:push" as="item()+">
<xsl:param name="stack" as="item()*"/>
<xsl:param name="item" as="item()"/>
<xsl:sequence select="$item, $stack"/>
</xsl:function>
<xsl:function name="x:pop" as="item()*">
<xsl:param name="stack" as="item()*"/>
<xsl:sequence select="remove($stack, 1)"/>
</xsl:function>
<xsl:function name="x:top" as="item()?">
<xsl:param name="stack" as="item()*"/>
<xsl:sequence select="$stack[1]"/>
</xsl:function>
:-)
That's just an idea, you might want to control more
precisely errors (what if one pops an empty stack?, etc.)
--
Regards,
Mukul Gandhi
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--