Re: [xsl] logic for writing two nested for-loops given a condition

Subject: Re: [xsl] logic for writing two nested for-loops given a condition
From: Jon Gorman <jonathan.gorman@xxxxxxxxx>
Date: Wed, 27 Apr 2005 09:38:17 -0500
> I have two for loops. The first for loop runs through the first file
> First.xml such that
>
> <xsl:for-each
>
select="document(First.xml)/SubConcepts/SubConcept">.............</xsl:for-ea
ch>
> <!--extract the '@name' value-->
>
> The second for loop is nested within the first loop and is as such
>
> <xsl:for-each
> select="document(Second.xml)/SubConcepts/SubConcept[1]/Value">
> <!--check if contains( '@name=text()' ) -->
>
> What I want to do is look for the '@name' value in the rest of the
> 'document(Second.xml)/SubConcepts/SubConcept' ONLY IF I dont find a
> match in the earlier SubConcept node's Value nodes.

So....I'm a little confused here, but that happens pretty often. I'm
taking a very, very wild stab and figure you are trying to find if an
attribute called name exists in the first xml document and if not go
to the second.

So if that's true I would recommend rewriting your for-each so they
are not nested.  Now if you're trying to find the node that has an
attirbute with a certain bit of text just add a conditional


<xsl:choose>
<xsl:when test="document(First.xml)/SubConcepts/SubConcept/Value/@name">

....do some stuff...
</xsl:when>
<xsl:when test="document(Second.xml)/SubConcepts/SubConcept/Value/@name">
</xsl:when>
...do some stuff...
</xsl:choose>

Of course, if you are working with quite a few xml documents I would
advocate a different approach.  Without knowing more about your
problem I might suggest using a dummy file that contains all the
filenames/paths and using an xsl stylesheet on that.

ie
<files>
<file>first.xml</file>
<file>second.xml</file>
<file>third..xml</file>
</file>

then in your stylesheet have --

<xsl:template match="file">
...
</xsl:template>

where you do the appropriate processing (or modify it so it has a
recursive call that passes a parameter that will halt output once the
appropriate node has been found).


<xsl:for-each>
select="document(First.xml)/SubConcepts/SubConcept">.............</xsl:for-ea
ch>

Jon Gorman

Current Thread