This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: cross-ref
- To: Bas Alberts <bas dot alberts at group2000 dot nl>
- Subject: Re: [xsl] cross-ref
- From: Jeni Tennison <mail at jenitennison dot com>
- Date: Wed, 8 Aug 2001 18:04:28 +0100
- CC: "'xsl-list at lists dot mulberrytech dot com'" <xsl-list at lists dot mulberrytech dot com>
- Organization: Jeni Tennison Consulting Ltd
- References: <9B821F66018BD411BACA009027C3B6074A9299@HERMES>
- Reply-To: xsl-list at lists dot mulberrytech dot com
Hi Bas,
> If I want to find the attribute value of a cross-ref element in
> another document, based on matching another attribute of the same
> element, thus:
>
> Match /elementName/@refAttr
> with $otherDoc//elementName/@refAttr
> to find $otherDoc//elementName/@desiredAttr
>
> the following is my best guess:
>
> <xsl:variable name="matchValue" select="/xxx/elementName/category" />
> <xsl:variable name="otherDoc" select="document('other.xml')"/>
>
> <!-- Now find the (desiredAttr) of (elementName)s with matchinf
> (refAttr)s. -->
> <xsl:variable name="crossRef"
> select="$otherDoc//elementName[@refAttr =
> $matchValue]/@desiredAttr"/>
It *might* be that you're setting the $matchValue variable to the wrong
thing - you originally said that the value you wanted to match was the
value of the refAttr attribute, but you're setting the $matchValue
variable to the value of the category child of the elementName
element instead. From your original description, you want to set
matchValue to:
<xsl:variable name="matchValue" select="/*/elementName/@refAttr" />
(Of course this assumes that elementName elements are direct children
of the document element in the source XML document.)
With this kind of lookup, it would be more efficient to use a key.
Index the elementName elements by their refAttr attributes:
<xsl:key name="elements-by-ref" match="elementName" use="@refAttr" />
Then to retrieve the elementName element with the $matchValue value
for the refAttr attribute, use an xsl:for-each to set the context to
the $otherDoc, and use the key() function to retrieve the element
that's being referred to:
<xsl:variable name="crossRef">
<xsl:for-each select="$otherDoc">
<xsl:value-of name="key('elements-by-ref',
$matchValue)/@desiredAttr" />
</xsl:for-each>
</xsl:variable>
I hope that helps,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list