Hi Evan et al,
I am having a problem with document() as well.
Assume I have a file "file.xml", which I will generate occasionally and want
to merge into my document. The current XSLT (call it "current.xsl") doesn't
call this file right now; the main file is named, oh, "main.xml".
The file "file.xml" looks like this:
<file>
<first>the first element</first>
<second>the second element</second>
<third>the third element</third>
</file>
How do I call the document() function to get the individual nodes out of the
file "file.xml" to be used by FOP in "current.xsl"?
I tried a merge, but it basically gave me all of both files, then formatted
according to the "current.xsl". Do I need to create a second style sheet to
use with xsl:apply-templates? The information I found on the document()
function wasn't extensive.
Thanks,
Michael Gosselin
Athena Diagnostics, Inc.
Worcester, MA 01605
-----Original Message-----
From: Evan Lenz [mailto:evan(_at_)evanlenz(_dot_)net]
Sent: Thursday, April 06, 2006 12:04 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] multiple source files map to multiple target files
However, assuming you have the XML source file that contains
the list of file names (URLs) that Michael mentioned, then a
single invocation of
document() can return all the root nodes from your XML files.
(You don't have to do it individually for each one, e.g.,
inside <xsl:for-each>.) And you don't need any extension
functions to do this.
Let's say you have a file named files.xml in the "config"
directory that contains this:
<files>
<file>input/foo.xml</file>
<file>input/bar.xml</file>
<file>input/bat.xml</file>
</files>
Given the above document, the following expression will
return a node-set containing three root nodes, corresponding
to the three files listed.
document(document('config/files.xml')/files/file)
The file names are resolved relative to the location of
files.xml by default, i.e. from the "config" directory in
this case. The XSLT processor will look for an "input"
directory inside the "config"
directory. If you want to resolve them relative to your main
source document (rather than from the "config" directory),
then you could use the second (optional) argument to the
document() function, like so:
document(document('config/files.xml')/files/file, /)
The / in the second argument tells the function to resolve
the URLs relative to the base URI of the source document
instead of from the config directory (where files.xml lives).
The XSLT processor will look for an "input" directory inside
whatever directory your source document came from.
Finally, if you want to resolve them relative to the
stylesheet's base URI, you would use this:
document(document('config/files.xml')/files/file, document(''))
The document('') in the second argument returns the root node
of the stylesheet itself, so the relative URLs in files.xml
are resolved relative to the base URI of the stylesheet. The
XSLT processor will look for an "input" directory insider
whatever directory your stylesheet came from.
One more note: all the above examples assume that the
"config" directory is in the same directory as the
stylesheet. When you pass document() a string as the first
argument it assumes the base URI of the stylesheet.
When you pass it a node-set as the first argument (as we did
with the <file> elements), then the function uses the base
URI of each node in the node-set. In either case, you can
override the base URI behavior by using the second optional
argument (which must be a node-set). So, for example, if the
"config" directory is in the same location as your source
document, then you'd want to substitute this to grab the root
node of files.xml in each of the above examples:
document('config/files.xml', /)
--~------------------------------------------------------------------
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>
--~--