Re: [xsl] cross-ref

Subject: Re: [xsl] cross-ref
From: Jeni Tennison <mail@xxxxxxxxxxxxxxxx>
Date: Wed, 8 Aug 2001 18:04:28 +0100
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


Current Thread