You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cocoon.apache.org by Scott Warren <ap...@gmail.com> on 2006/08/03 02:47:55 UTC

Extract Document

Can anyone give me a tip on the best way to extract a fragment of a document
using xpath? The Fragment Extractor Transformer doesn't seem to do the job.
Not that the documentation says much about what it does. I have tried an XSL
using the EXSLT dyn:evaluate function but this fails. Note the xpath will
come from parameters passed to the pipeline.

Regards

Scott Warren

Re: Extract Document

Posted by Scott Warren <ap...@gmail.com>.
Thanks for the response. I later found out it was because I didn't have the
right namespace in my XSL so therefore the evaluate function fails. I have
fixed this. I was surprised that there was not a transformer that would take
an xpath parameter and simply return the required fragment. I thought I was
missing something.

Thanks

Scott Warren

On 8/3/06, Jason Johnston <co...@lojjic.net> wrote:
>
> Scott Warren wrote:
> > Can anyone give me a tip on the best way to extract a fragment of a
> > document using xpath? The Fragment Extractor Transformer doesn't seem
> > to do the job. Not that the documentation says much about what it
> > does. I have tried an XSL using the EXSLT dyn:evaluate function but
> > this fails. Note the xpath will come from parameters passed to the
> > pipeline.
>
> In what way does dyn:evaluate fail?  I do think that may be the shortest
> path to what you're wanting.
>
> I looked through the core components shipped with Cocoon and didn't see
> any that would evaluate an XPath out of the box.  XSLT would be ideal,
> except for the fact that you want to pass in the XPath as a parameter,
> so as you obviously realized the difficulty comes when trying to
> evaluate the passed-in string parameter as an XPath expression to select
> a nodeset.  This is exactly what dyn:evaluate is intended for so I think
> you're on the right track.
>
> OK, I just gave it a quick try and the following XSLT worked just fine:
>
>
> <xsl:stylesheet version="1.0"
>                  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>                  xmlns:dyn="http://exslt.org/dynamic"
>                  extension-element-prefixes="dyn">
>
>    <xsl:param name="xpath" />
>
>    <xsl:template match="/">
>      <xsl:copy-of select="dyn:evaluate($xpath)" />
>    </xsl:template>
>
> </xsl:stylesheet>
>
> ...
>
> <map:transform src="extract.xsl">
>    <map:parameter name="xpath" value="/my/xpath/expression" />
> </map:transform>
>
>
> If your xpath will return more than one node then you should wrap it in
> a single parent element to maintain a valid XML document.
>
> Let us know if you still have problems.
> --Jason
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@cocoon.apache.org
> For additional commands, e-mail: users-help@cocoon.apache.org
>
>

Re: Extract Document

Posted by Jason Johnston <co...@lojjic.net>.
Scott Warren wrote:
 > Can anyone give me a tip on the best way to extract a fragment of a
> document using xpath? The Fragment Extractor Transformer doesn't seem
> to do the job. Not that the documentation says much about what it
> does. I have tried an XSL using the EXSLT dyn:evaluate function but
> this fails. Note the xpath will come from parameters passed to the
 > pipeline.

In what way does dyn:evaluate fail?  I do think that may be the shortest 
path to what you're wanting.

I looked through the core components shipped with Cocoon and didn't see 
any that would evaluate an XPath out of the box.  XSLT would be ideal, 
except for the fact that you want to pass in the XPath as a parameter, 
so as you obviously realized the difficulty comes when trying to 
evaluate the passed-in string parameter as an XPath expression to select 
a nodeset.  This is exactly what dyn:evaluate is intended for so I think 
you're on the right track.

OK, I just gave it a quick try and the following XSLT worked just fine:


<xsl:stylesheet version="1.0"
                 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                 xmlns:dyn="http://exslt.org/dynamic"
                 extension-element-prefixes="dyn">

   <xsl:param name="xpath" />

   <xsl:template match="/">
     <xsl:copy-of select="dyn:evaluate($xpath)" />
   </xsl:template>

</xsl:stylesheet>

...

<map:transform src="extract.xsl">
   <map:parameter name="xpath" value="/my/xpath/expression" />
</map:transform>


If your xpath will return more than one node then you should wrap it in 
a single parent element to maintain a valid XML document.

Let us know if you still have problems.
--Jason

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@cocoon.apache.org
For additional commands, e-mail: users-help@cocoon.apache.org