xsl-list
[Top] [All Lists]

RE: External XML Doc help

2003-03-17 14:57:04
[ Karl Stubsjoen]

<xsl:template match="myexternalxml">
    <xsl:copy-of select="document('myxmldoc.xml)//testint/test"/>
</xsl:template>


This works great... spits out all the xml in the document 
"myxmldoc.xml".
However, I need to loop through a nodelist within this 
document and I'm not
sure how to set up my templates to do this.  How would I, 
lets say, loop
through all test nodes in the following "myxmldoc" xml document:

<testing>
    <test>1234</test>
    <test>1234</test>
    <test>1234</test>
    <test>1234</test>
</testing>


document()/ gives you the root of your external xml file.  You have to
do something that changes the context node to that document, then you
can do anything you like with it.

For example -

<xsl:template match="myexternalxml">
    <xsl:for-each select="document('myxmldoc.xml')/testing">
        <xsl:apply-templates select='test'/>
    </xsl:for-each>
</xsl:template>

Here, xsl:for-each changes the context to the (one and only) "testing"
node in the external file.

Or - 

<xsl:variable name='tests'
select="document('myxmldoc.xml')/testing/test"/>
<!-- then, within a template, -->
<xsl:apply-templates select='$tests'/>
....
<!-- outside the above template: -->
<xsl:template match='test'>
        ... do something  here ...
</xsl:template>

Here, the xsl:apply-templates changes the context for you.  If you could
have "test" elements in your main source document and you do not want
the same template to process "test" elements from both documents, then
use template modes -

<xsl:variable name='tests'
select="document('myxmldoc.xml')/testing/test"/>
<!-- then, within a template, -->
<xsl:apply-templates select='$tests' mode='externals'/>
....
<!-- outside the above template: -->
<xsl:template match='test' mode='externals'>
        ... do something  here ...
</xsl:template>

Cheers,

Tom P

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



<Prev in Thread] Current Thread [Next in Thread>