xsl-list
[Top] [All Lists]

RE: Predicates using current node-set

2002-10-02 02:52:09
Hi,

I have a problem using predicate expressions where I compare 
an attribute in
the node-set to an attribute in the "current node-set". I 
have problems
explaing this, so here's an example:

xml file:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="paytest.xsl"?>
<payments>
      <oldpayments>
              <oldpayment payno="1" amount="100" ref="a" />
              <oldpayment payno="2" amount="200" ref="b" />
              <oldpayment payno="3" amount="300" ref="c" />
      </oldpayments>
      <newpayments>
              <newpayment Payno="3" amount="300" />
              <newpayment Payno="4" amount="300" />
      </newpayments>
</payments>

xsl file:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output method="html"/>

<xsl:template match="/">
<html>
<head><title>test</title></head>
<body>
<xsl:apply-templates select="/payments/newpayments/newpayment" />
</body>
</html>
</xsl:template>

<xsl:template match="/payments/newpayments/newpayment">
      Payno: <xsl:value-of select="@Payno"/> 
      Amount: <xsl:value-of select="@amount"/>
      <xsl:if test="/payments/oldpayments/oldpayment/@payno = @Payno">
              Ref: <xsl:value-of
select="/payments/oldpayments/oldpayment[(_at_)payno=@Payno]/@ref"/>
      </xsl:if>
      <br/>
</xsl:template>

Result in browser:
Payno: 3 Amount: 300 Ref: 
Payno: 4 Amount: 300

I wanted the "ref" attribute to be printed, but I cant work 
out how to match
the oldpayment payno with the newpayment Payno

keys might make your stylesheet more readable and easier to maintain,

<xsl:key name="old" match="oldpayments/oldpayment" use="@payno" />

<xsl:template match="newpayment">
        Payno: <xsl:value-of select="@Payno"/> 
        Amount: <xsl:value-of select="@amount"/>
        <xsl:if test="key('old', @Payno)">
                Ref: <xsl:value-of select="key('old', @Payno)/@ref"/>
        </xsl:if>
        <br/>
</xsl:template>

But as Oleg said, using current() will get you there, too.

Cheers,

Jarno

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



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