Re: [xsl] Why do these xsl:variable declarations give different results?

Subject: Re: [xsl] Why do these xsl:variable declarations give different results?
From: "Imsieke, Gerrit, le-tex" <gerrit.imsieke@xxxxxxxxx>
Date: Fri, 21 Dec 2012 00:32:21 +0100
The second alternatives variable holds in fact a document node, according to

If a variable-binding element has no select attribute and has non-empty content (that is, the variable-binding element has one or more child nodes), and has no as attribute, then the content of the variable-binding element specifies the supplied value. The content of the variable-binding element is a sequence constructor; a new document is constructed with a document node having as its children the sequence of nodes that results from evaluating the sequence constructor and then applying the rules given in 5.7.1

If you want to make it a topic element, you should explicitly declare the variable as such:
<xsl:variable name="containingChapter" as="element(topic)">


On 2012-12-21 00:24, Steve Fogel wrote:
Hi, all.

Would appreciate some help. I don't understand how these two definitions of a variable produce different results. This is from the DITA Open Toolkit (OT).

1st alternate definition is without a condition:

<xsl:variable name="containingChapter"
      select="ancestor-or-self::*[contains(@class, ' topic/topic ')][position()=last()]"/>

2nd alternate definition is with a condition, which is me fixing a bug in the (OT).

<xsl:variable name="containingChapter">
         <xsl:when test="$hasBookParts">  <!-- The book has <part>s -->
             <xsl:copy-of select="ancestor-or-self::*[contains(@class, ' topic/topic ')][last()-1]"/>
             <xsl:copy-of select="ancestor-or-self::*[contains(@class, ' topic/topic ')][last()]"/>

Both definitions should return a <topic> element with an id attribute. Following the definition is this statement:

<xsl:variable name="id" select="$containingChapter/@id"/>

With the first definition, the value of id is a string, as desired. With the 2nd, it's empty. Bad. Why?

For the 1st definition, the Oxygen debugger gives the value type as "element(1)". For the 2nd, it gives the value type as "document-node(1)". In fact, if you look at the value of the variable in Oxygen's Nodes/Values Set window, for the 1st definition it is:


and for the 2nd, it is:


Can someone please advise?

Many thanks!


Steve Fogel | Information Architect, Oracle Database | 650.506.4914
Oracle Server Technologies Information Development
500 Oracle Parkway | M/S 4op1126 | Redwood Shores, CA 94065

-- Gerrit Imsieke Geschdftsf|hrer / Managing Director le-tex publishing services GmbH Weissenfelser Str. 84, 04229 Leipzig, Germany Phone +49 341 355356 110, Fax +49 341 355356 510 gerrit.imsieke@xxxxxxxxx,

Registergericht / Commercial Register: Amtsgericht Leipzig
Registernummer / Registration Number: HRB 24930

Geschdftsf|hrer: Gerrit Imsieke, Svea Jelonek,
Thomas Schmidt, Dr. Reinhard Vvckler

Current Thread