[xsl] Key problem. Ordering XML with conditions than generate new associations.

Subject: [xsl] Key problem. Ordering XML with conditions than generate new associations.
From: "Gabriel Osorio" <gosorio@xxxxxxxxxxx>
Date: Wed, 28 Sep 2005 11:08:35 -0500
About: "RE: [xsl] Another <xsl:key> problem "

My intentions are educational. :-) I'm a beginner.

Now my problem is to order nodes in groups based on certain characteristics
of their children. (Using DIV tags.) And perhaps seeing to other way I can
find my own solution.

Really I do not have opinion. I used your template and did not obtain
results, because of it I sent the xml again.

Your recursion solution is elegant, but I can't understand the siblings use.


May be you can help me...

____________________________________________________________
My own problem is:

This is language's teacher board offer example. I need sort teacher's offers
by price. And sort teachers from cheapest to most expensive. 

With this rule: "If the course can pay with credit card or is not informed,
it's a promotion." 

The promotions are a new group. And carry out the teacher's rules.

Other additional complication: courses have two or more teachers. And the
sorted group uses the first teacher's name.

--------------------------------------------------
My XML:
--------------------------------------------------
<?xml version="1.0" ?>
<root>
      <grade>
            <course>
                  <class>1</class>
                  <shift>0</shift>
                  <teacher>Z</teacher>
            </course>
            <course>
                  <class>2</class>
                  <shift></shift>
                  <teacher>na</teacher>
            </course>
            <var>
              <pay></pay>
              <price>200</price>
            </var>
      </grade>
      <grade>
            <course>
                  <class>1</class>
                  <shift>1</shift>
                  <teacher>X</teacher>
            </course>
            <course>
                  <class>2</class>
                  <shift></shift>
                  <teacher>X</teacher>
            </course>
            <var>
              <pay>All</pay>
              <price>170</price>
            </var>
      </grade>
      <grade>
            <course>
                  <class>1</class>
                  <shift>1</shift>
                  <teacher>Y</teacher>
            </course>
            <course>
                  <class>2</class>
                  <shift></shift>
                  <teacher>Y</teacher>
            </course>
            <var>
              <pay>Basic</pay>
              <price>150</price>
            </var>
      </grade>
      <grade>
            <course>
                  <class>1</class>
                  <shift>0</shift>
                  <teacher>X</teacher>
            </course>
            <course>
                  <class>2</class>
                  <shift></shift>
                  <teacher>X</teacher>
            </course>
            <var>
              <pay>Credit</pay>
              <price>100</price>
            </var>
      </grade>
      <grade>
            <course>
                  <class>1</class>
                  <shift>1</shift>
                  <teacher>Z</teacher>
            </course>
            <course>
                  <class>2</class>
                  <shift></shift>
                  <teacher>Z</teacher>
            </course>
            <var>
              <pay>All</pay>
              <price>100</price>
            </var>
      </grade>
      <grade>
            <course>
                  <class>1</class>
                  <shift>1</shift>
                  <teacher>X</teacher>
            </course>
            <course>
                  <class>2</class>
                  <shift></shift>
                  <teacher>na</teacher>
            </course>
            <var>
              <pay>All</pay>
              <price>70</price>
            </var>
      </grade>
</root>
--------------------------------------------------
My XSL is:
--------------------------------------------------
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";> 
<xsl:key name="order1" match="grade" use="((substring(var/pay,1,1))='') or
((substring(var/pay,1,1))='C')" />
<xsl:key name="order2" match="grade"
use="concat(((substring(var/pay,1,1))='') or
((substring(var/pay,1,1))='C'),course[1]/teacher)" />
<xsl:template match='root'> 
  <table>
  <!--Expecial logic for C pay nodes.-->
    <xsl:for-each select="grade[count(. | key('order1', 'true')[1]) = 1]">
      <xsl:if test="generate-id()=generate-id(key('order1', 'true'))">
      <tr><td><div><xsl:attribute
name="id">credit_offer</xsl:attribute><table>
      <tr><td>Credit Offer</td></tr>
      <xsl:for-each select="key('order1', 'true')">
            <xsl:sort select="var/price" order="ascending"
data-type="number"/>
                  <xsl:call-template name="course"/>
        </xsl:for-each>
      </table></div></td></tr>
        </xsl:if>
    </xsl:for-each>
  <!--Logic to group nodes with standar pays-->
    <xsl:for-each select="grade[count(. | key('order2',
concat('false',course[1]/teacher))[1]) = 1]">
    <xsl:if test="generate-id()=generate-id(key('order2',
concat('false',course[1]/teacher)))">
      <tr><td><div><xsl:attribute name="id"><xsl:value-of
select="course[1]/teacher"/></xsl:attribute><table>
      <tr><td>Teacher's Leader: <xsl:value-of
select="course[1]/teacher"/></td></tr>
      <xsl:for-each select="key('order2',
concat('false',course[1]/teacher))">
        <xsl:sort select="var/price" order="ascending" data-type="number"/>
                  <xsl:call-template name="course"/>
        </xsl:for-each>
        </table></div></td></tr>
      </xsl:if>
    </xsl:for-each>
  </table>
</xsl:template>
<!--The rest.-->
<xsl:template name="course"> 
  <tr>
    <td><xsl:value-of select="position()"/>.</td>
    <td>Price: <xsl:value-of select="var/price"/>.</td>
    <td><xsl:apply-templates select='course'/></td>
  </tr>
</xsl:template>
<xsl:template match="course">
    <br/>teacher: <xsl:value-of select="teacher"/>&#xa0;&#xa0;
    class: <xsl:value-of select="class"/>&#xa0;&#xa0;
    shift: <xsl:value-of select="shift"/>&#xa0;&#xa0;
    Pay: <xsl:value-of select="../var/pay"/>
</xsl:template>
</xsl:stylesheet>


Thanks in advance.

Gabriel

Current Thread