xsl-list
[Top] [All Lists]

RE: Template call question

2004-06-28 08:59:53
I haven't fully understood this, but I've made a few points where the code
looks questionable. 

I have the following xslt:


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
      <xsl:output method="xml" version="1.0" encoding="UTF-8"
indent="yes"/>

<xsl:variable name="MYPARENT" 
select="Redirect_URL_Comparison/QUERY1"/>
<xsl:template match="Redirect_URL_Comparison">

<table>
<xsl:variable name="ORG_URL"
select="QUERY1/row/VWCAMPAIGNREDIRECT.AR_URL"/>

The QUERY1 has multiple rows, so this will select a set of elements. No
problem with that, but because you used a singular variable name I'm not
sure you're aware of it.

<xsl:variable name="NEW_URL" select="NONE"/>

Since you have no elements named "NONE", this variable will be an empty
node-set. Again, not intrisically wrong, so long as you know what you are
doing.

<tr>
              <td>name:</td>
              <td>
                      <xsl:value-of
select="$MYPARENT/row/VWCAMPAIGNREDIRECT.AR_NAME"/>

Because there are multiple rows, xsl:value-of (in XSLT 1.0) will output the
value of this item in the first row. Is that what you intended?

<xsl:for-each select="QUERY1">

There is only one QUERY1 element in your data, so sorting the set of QUERY1
elements is not going to achieve much.

<xsl:sort select="row/VWCAMPAIGNREDIRECT.AR_URL"/>

<xsl:call-template name="get_url">
<xsl:with-param name="PREV_URL"/>
<xsl:with-param name="CURR_URL" select="$ORG_URL"/>
</xsl:call-template>
</xsl:for-each>
</table>

</xsl:template>


<xsl:template name="get_url">
 <xsl:param name="PREV_URL"/>
 <xsl:param name="CURR_URL"/>

<xsl:for-each
select="$MYPARENT/row[VWCAMPAIGNREDIRECT.AR_URL=$CURR_URL]">

In the xsl:for-each you're processing all the rows where this item is equal
to $CURR_URL, which as noted earlier is actually a node-set containing all
the values of VWCAMPAIGNREDIRECT.AR_URL. "=" returns true if the value
matches any of these values, which it always will, because all the values
are present in the set.  

<tr>
<xsl:choose>
<xsl:when

test="((normalize-space($CURR_URL)=normalize-space(VWCAMPAIGNREDIRECT.AR_URL
)) )">

Now you have me completely confused: you've selected nodes where A=$B, and
now you're testing to see if normalize-space(A)=normalize-space($B). If two
strings are equal, they will still be equal after normalizing whitespace, so
the xsl:when branch will always be chosen. In fact it's more subtle than
this, because normalize-space selects the first node in the node-set, but I
think we're now so many errors deep that it's not worth further analysis.

Michael Kay



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