This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: determining position of a document included using document function
- From: "Gennady Loskutov" <g_loskutov at myrealbox dot com>
- To: <xsl-list at lists dot mulberrytech dot com>
- Date: Thu, 14 Feb 2002 11:03:09 +0100
- Subject: Re: [xsl] determining position of a document included using document function
- References: <DCEPIHHFOCEMDBGBKIOPEEOECDAA.bry@itnisk.com>
- Reply-to: xsl-list at lists dot mulberrytech dot com
> is there anyway to find out the position of file in the root document,
> without trying to do <xsl:apply-templates>
> <xsl:with-param name="filepos" select="position()"/>
> </xsl:apply-templates>
Bryan,
I use generate-id() function to identify the included file. Basically, the
idea is to match generated id for the root element of the current node with
ones, generated separately and stored in a variable. According to XSLT spec,
generate-id(document("foo.xml"))=generate-id(document("foo.xml")) is always
true, so I assume that
generate-id(document("foo.xml"))=generate-id(document(/files/file/@href))
must be also true if the "foo.xml" file is among those specified in
/files/file/@href.
To use my solution, you must use an extension function to transform a result
tree fragment stored in a variable into a node set (I use Microsoft XML
parser, which has node-set() function).
For example, using the following XML file
<?xml version="1.0" ?>
<files>
<file href="data1.xml" />
<file href="data2.xml" />
<file href="data3.xml" />
</files>
I declare a variable, which is a union of the documents
<xsl:variable name="merged" select="document(/files/file/@href)" />
Then I store generated id for each document root in another variable:
<xsl:variable name="tops">
<xsl:for-each select="/files/file">
<file>
<xsl:copy-of select="@href" />
<xsl:attribute name="id"><xsl:value-of
select="generate-id(document(@href))" /></xsl:attribute>
</file>
</xsl:for-each>
</xsl:variable>
When I need to know the file URL, I do the following:
<xsl:template match="myElement">
...
<xsl:variable name="currentTop" select="generate-id(/)" />
<url>
<xsl:value-of select="msxsl:node-set($tops)/file[@id = $currentTop]/@href"
/>
</url>
Regards,
Gennady
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list