xsl-list
[Top] [All Lists]

RE: [xsl] (Possible) pitfall: XSLT 2, 9.4 Creating implicit document nodes

2012-05-09 10:22:15
You can give assign a type to v1 (and v2 as well) to make both variables
behave the same. Notice, however, that the value of select in
apply-templates was changed as well (this time, both variables hold a
sequence, not a temporary tree). 

  <xsl:template match="/">
    <xsl:variable name="v1" as="item()*">
      <xsl:sequence select="a"/>
    </xsl:variable>
    <xsl:variable name="v2" as="item()*" select="a"/>


    <xsl:text>v1: </xsl:text>
    <xsl:apply-templates select="$v1" mode="out"/>
    <xsl:text>&#xa;</xsl:text>

    <xsl:text>v2: </xsl:text>
    <xsl:apply-templates select="$v2" mode="out"/>
  </xsl:template> 

You can choose the type of the variables to be item(), element(), item()* or
element()*, whichever serves best your needs.
Jakub. 

-----Original Message-----
From: Christian Roth [mailto:roth(_at_)visualclick(_dot_)de]
Sent: Wednesday, May 09, 2012 5:02 PM
To: XSL List
Subject: [xsl] (Possible) pitfall: XSLT 2, 9.4 Creating implicit document
nodes

Hello,

this is a heads-up for a pitfall (that at least I have fallen into several
times
now...) with respect to XSLT 2, 9.4 "Creating implicit document nodes":

<http://www.w3.org/TR/xslt20/#temporary-trees>

With the source document:

--src.xml--
<a>
  <b/>
</a>
-----------

and this transformation

--transformation.xsl--
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
  xmlns:xs="http://www.w3.org/2001/XMLSchema";
  exclude-result-prefixes="xs"
  version="2.0">

  <xsl:template match="/">
    <xsl:variable name="v1"><xsl:sequence select="a"/></xsl:variable>
    <xsl:variable name="v2" select="a"/>


    <xsl:text>v1: </xsl:text>
    <xsl:apply-templates select="$v1/a" mode="out"/>
    <xsl:text>&#xa;</xsl:text>

    <xsl:text>v2: </xsl:text>
    <xsl:apply-templates select="$v2/a" mode="out"/>
  </xsl:template>


  <xsl:template match="*" mode="out">
    <xsl:value-of select="name()"/>
    <xsl:apply-templates mode="#current"/>
  </xsl:template>


  <xsl:template match="text()" mode="#all"/> </xsl:stylesheet>
-----------

the output is:

--output--
v1: ab
v2:
----------

I understand now why this is so per the spec, although I was puzzled at
first.

However, I've spent considerable time debugging stylesheets where
accessing a tunnel variable with $var/elem sometimes yielded nothing (see
v2 in my example above) until I found that in some places, the variable
was
defined using <xsl:sequence> (because some complex content construction
takes place which is either not doable or hardly readable using a single
XPath
expression), and using a select attribute at other places.

Is there a technique or pattern I could employ (maybe utilizing the @as
attribute somehow?) to unify the access to variable contents where I know
that the sequences are node sequences, regardless of their content
construction using @select or <xsl:sequence>?

Thanks,
Christian
--~------------------------------------------------------------------
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>
--~--



--~------------------------------------------------------------------
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>
--~--