Subject: Re: [xsl] Split into numbered files: without side-effect? (XSLT 2) From: David Carlisle <davidc@xxxxxxxxx> Date: Fri, 28 Sep 2007 12:57:32 +0100 |
1) I'm still "cheating" somehow, by using saxon:evaluate. If I wanted to do without, which way would I have to go, roughly? (Is this related to Joe's comment "if the full XPaths are stored in the config file then some extension is needed to evaluate these dynamically"?) It depends what you "paths" are like. The problem of executing xpaths supplied at runtime is a general one unrelated to the particular use here. XSLt has no way of evaluating a string as an XPath (in princiiple an xslt compiler may have parsed everything into internal form so the runtime system need not have any Xpath parser to hand at all. people cooming from interpretted languages (or even compiled ones0 find this strange, but it's no different from say, C, where you can't just pass in a string of C syntax at run time and expect a compiled c program to know whet to do with it unless it is linked to a C compiler. Very often though (eg sorting tables) you just need to specify an element name, not a full path and that can be done with select="*[name()=$name]" if $name is the dynamically supplied string. If you know it's always a two part path with 2 names you can of course do select="*[name()=$name1]/*[name()=$name2" but this gets tedious if you want to be able to specify arbitrary paths. So if youi want to specify arbitrary paths you need to get hold of the Xpath parser and xpath execution of your system saxon provides a saxon:evaluate but the way of doing it without an extension is to present teh xpaths as part of a stylesheet that you import, so instead of a configuration file like <x> <path name="a">a/b/c</path> <path name="a">a/b/d</path> <path name="a">a/b[not(@foo)]/z</path> </x.> You use <xsl:stylesheet ...> <xsl:function name="my:path"> <xsl:param name="node" as="node()"/> <xsl:param name="name" as="xs:string"/> <xsl:choose> <xsl:when test="$name='a'"><xsl:sequence select="$node/a/b/c"/></xsl:when> <xsl:when test="$name='b'"><xsl:sequence select="$node/a/b/d"/></xsl:when> ... which you use as <xsl:import href="..."/> ... select="my:path(.,'b')" which will look up "path b" relative to the current node, where "path b" is as specified in the configuration file. If you don't want to write teh configuration as xsl:function syntax, then you can write it in any syntax you wnat (eg <x><path... as above) and just "precompile" it into an xsl:function using a simple XSLt transform. > I would prefer to avoid processing the full usual model is <xsl:result-documemt href="main output"> <xsl:for-each select="something"> <xsl:variable name="chunk"> <xsl:apply-templates/> </xsl:variable> <xsl:copy-of select="$chunk"/><!-- to main output--> <xsl:result-document href="chunk{position()}"> <xsl:copy-of select="$chunk"/><!-- to this chunk--> </xsl:result-document> </xsl:result-document> David ________________________________________________________________________ The Numerical Algorithms Group Ltd is a company registered in England and Wales with company number 1249803. The registered office is: Wilkinson House, Jordan Hill Road, Oxford OX2 8DR, United Kingdom. This e-mail has been scanned for all viruses by Star. The service is powered by MessageLabs. ________________________________________________________________________
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Split into numbered files, Yves Forkl | Thread | Re: [xsl] Split into numbered files, Yves Forkl |
RE: [xsl] Wrapping two different el, Vladimir Rodimyuk | Date | RE: [xsl] Split into numbered files, Michael Kay |
Month |