RE: [xsl] Cannot process a result tree fragment as a node-set under XSLT 1.0 - My alternative don´t function

Subject: RE: [xsl] Cannot process a result tree fragment as a node-set under XSLT 1.0 - My alternative don´t function
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Sat, 12 Apr 2008 20:03:26 +0100
It's not always possible to get by without using result tree fragments but
it is possible in this case. And in general, if you can write

<xsl:variable name="x">
  <xsl:when test="condition1">
    <xsl:copy-of select="exp1"/>
  </xsl:when>
  <xsl:otherwise>
    <xsl:copy-of select="exp2"/>
  </xsl:otherwise>
</xsl:variable>

then you can probably replace it with

<xsl:variable name="x" select="exp1[condition1] | exp2[condition2]"/>

which avoids the cost of copying the nodes, and avoids the RTF problem.

Of course an even better solution is to move to XSLT 2.0.

Michael Kay
http://www.saxonica.com/

> -----Original Message-----
> From: Alejandro [mailto:alexcontini@xxxxxxxx]
> Sent: 12 April 2008 18:50
> To: mike@xxxxxxxxxxxx
> Cc: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] Cannot process a result tree fragment as a
> node-set under XSLT 1.0 - My alternative don4t function
>
> Hi Michael,
>
> Thank you so much for the quick response.
>
> Michael >>However, it's not clear to me that you need to
> create an RTF in the first place. Why not define $filter as
>     <xsl:variable name="filter" select="//RecursoEx1[($option=1 and
> F_FIN=$date1 and contains(TITULO,'o')) or ($option=2 and
> F_FIN=$date2)]"/>
>
> I want to count the RecursoEx1 elements:
>     <p>Number: <xsl:value-of
> select="count(exsl:node-set($filter)/RecursoEx1)"/></p> CORRECT!
>
> I want to iterate over the RecursoEx1 elements:
>     <xsl:for-each select="exsl:node-set($filter)/RecursoEx1">
> CORRECT !
>
> I use xsl:copy-of and exsl:node-set because to error "Cannot
> process a result tree fragment as a node-set under XSLT 1.0"
> if i code :
>
> <xsl:variable name="filtro">
>         <xsl:choose>
>             <xsl:when test="$option=1">
>                 <xsl:copy-of
> select="//RecursoEx1[F_FIN=$date1]"/></xsl:when>
>             <xsl:otherwise>
>                 <xsl:copy-of
> select="//RecursoEx1[F_FIN=$date2]"/></xsl:otherwise>
>         </xsl:choose>
>     </xsl:variable>
>
>     <p>Number: <xsl:value-of select="$filter"/></p>
>
>     <xsl:for-each select="$filter">
>          <p><xsl:value-of select="TITULO"/></p>
>     </xsl:for-each>
>
>
> and i don4t know if exits another posibility. Exists??
>
> The variable "option" is to received from one formulary, but
> there are more and then the "filter" will be dynamic.
>
> How can i do to construct the filter dynamic? For example, i
> receive one varible named "title" from the formulary with the
> value: "John Martin Car Monday" and i like to enumerate the
> RecursoEx1 elements that meet with this
> condition: TITLE=John or TITLE=Martin or TITLE=Car or TITLE=Monday.
>
> or title variable is Apple Pencil, ..... then the condition
> will be TITLE=Apple or TITLE=Pencil
>
> i don4t know how may parameters i will receive in advance..
>
> Thanks again Michael,
>
> Alexander
>
>
> ----- Mensaje original -----
> De: "Michael Kay" <mike@xxxxxxxxxxxx>
> Para: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
> Enviado: sabado, 12 de abril de 2008 14:03
> Asunto: RE: [xsl] Cannot process a result tree fragment as a
> node-set under XSLT 1.0 - My alternative don4t function
>
>
> The node-set returned by the exsl:node-set() function will
> always contain a single (document or root) node. Perhaps you
> wanted its children:
> exsl:node-set()/*.
>
> However, it's not clear to me that you need to create an RTF
> in the first place. Why not define $filter as
>
> <xsl:variable name="filter"
>    select="//RecursoEx1[($option=1 and F_FIN=$date1 and
> contains(TITULO,'o'))
>                         or ($option=2 and F_FIN=$date2)]"/>
>
> Note also, that horrible bit of disable-output-escaping can
> be avoided by setting the doctype-system and doctype-public
> attributes on xsl:output.
>
> Michael Kay
> http://www.saxonica.com/
>
>
> > -----Original Message-----
> > From: Alejandro [mailto:alexcontini@xxxxxxxx]
> > Sent: 12 April 2008 13:05
> > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > Subject: [xsl] Cannot process a result tree fragment as a node-set
> > under XSLT 1.0 - My alternative don4t function
> >
> > Hello, i want to recover any records in function of one variable
> > (option in this case), and i don4t know to do it. I want to
> print the
> > TITULO element the those records.
> > Can you help me, please?
> >
> > Cheers,
> > Alexander
> >
> >
> > ********************************* XML
> > *************************************
> >
> > <?xml version="1.0"?>
> >
> > <List>
> > <RecursoEx1>
> > <TITULO>Sara Baras</TITULO>
> > <F_INICIO>20080125000000</F_INICIO>
> > <F_FIN>20080211000000</F_FIN>
> > </RecursoEx1>
> >
> > <RecursoEx1>
> > <TITULO>Exposicion de pintura</TITULO>
> > <F_INICIO>20080201000000</F_INICIO>
> > <F_FIN>20080211000000</F_FIN>
> > </RecursoEx1>
> >
> > <RecursoEx1>
> > <TITULO>Inaguracion de ...</TITULO>
> > <F_INICIO>20080205000000</F_INICIO>
> > <F_FIN></F_FIN>
> > </RecursoEx1>
> >
> > <RecursoEx1>
> > <TITULO>Clausura de ..</TITULO>
> > <F_INICIO>20080101000000</F_INICIO>
> > <F_FIN>20080205000000</F_FIN>
> > </RecursoEx1>
> >
> > </List>
> >
> >
> > ********************** XSL **********************
> >
> > <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet
> > xmlns:i18n="http://apache.org/cocoon/i18n/2.0";
> > xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> > xmlns:exsl="http://exslt.org/common";
> >     extension-element-prefixes="exsl" version="1.0">
> >
> > <xsl:output method="html" media-type="text/html;charset=iso-8859-1"
> > indent="yes" encoding="ISO-8859-1" omit-xml-declaration="yes" />
> >
> > <xsl:variable name="date1" select="20080205000000"></xsl:variable>
> > <xsl:variable name="date2" select="20080211000000"></xsl:variable>
> > <xsl:variable name="option" select="1"></xsl:variable>
> >
> > <xsl:template match="/">
> >
> > <xsl:text disable-output-escaping="yes"><![CDATA[<!DOCTYPE
> > html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
> > "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>]]></xsl:text>
> >
> > <html xmlns="http://www.w3.org/1999/xhtml"; xml:lang="es">
> >
> > <head>
> >  <title>Gabinete of Prensa</title>
> >     <meta http-equiv="Content-Type" content="text/html;
> > charset=iso-8859-1"
> > />
> > </head>
> >
> > <body>
> >
> >     <xsl:variable name="filter">
> >         <xsl:choose>
> >             <xsl:when test="$option=1">
> >                 <xsl:copy-of
> > select="//RecursoEx1[F_FIN=$date1 and
> > contains(TITULO,'o')]"/></xsl:when>
> >             <xsl:otherwise>
> >                 <xsl:copy-of
> > select="//RecursoEx1[F_FIN=$date2]"/></xsl:otherwise>
> >         </xsl:choose>
> >     </xsl:variable>
> >
> >
> >
> >
> >
> >  <p>Number: <xsl:value-of
> > select="count(exsl:node-set($filter))"/></p> <!-- DON'T FUNCTION -->
> >
> >  <xsl:for-each select="exsl:node-set($filter)">
> >      <p><xsl:value-of
> > select="exsl:node-set($filter)/TITULO"/></p>      <!--
> > DON'T FUNCTION -->
> > </xsl:for-each>
> >
> > </body>
> > </html>
> > </xsl:template>
> >
> > </xsl:stylesheet>

Current Thread