This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: merging two documents - only if second document matches


Oliver Becker wrote:
> <xsl:template match="/">
>    <xsl:for-each select="$idsA[. = $idsB]">
>       <xsl:copy-of select="." />
>    </xsl:for-each>
> </xsl:template>
>
> The question is, if your input is really as simple as you said.
> For example it might be reasonable comparing the normalized string
> values like this
>    normalize-space() = normalize-space($idsB)
> inside of the predicate.

One of those horrible situations where the behaviour of '=' in XPath
turns round and bites you...

In the original path:

  $idsA[. = $idsB]

then you're filtering in any nodes in $idsA whose value is the same
as *any* of the nodes in $idsB.

If you do:

  $idsA[normalize-space() = normalize-space($idsB)]

then the normalize-space($idsB) selects *only the first* of the nodes
in $idsB and gives your its normalized value. So you only get any
$idsA node that has the same value as the first $idsB.

To get round this, you need to work through all the $idsA 'by hand'
and put the test in an xsl:if:

  <xsl:for-each select="$idsA">
     <xsl:if test="$idsB[normalize-space() =
                         normalize-space(current())]">
        <xsl:copy-of select="." />
     </xsl:if>
  </xsl:for-each>

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/



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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]