Hi All,
(I hope that you could forget and excuse my incorrect use of the language.)
This is a summarized example of my actual task.
I’m requesting help to the list’s members because I can’t find a correct
solution.
--------------------------------------------------
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"/>  
class: <xsl:value-of select="class"/>  
shift: <xsl:value-of select="shift"/>  
Pay: <xsl:value-of select="../var/pay"/>
</xsl:template>
</xsl:stylesheet>
--------------------------------------------------
The XML is:
--------------------------------------------------
<?xml version="1.0" ?>
<?xml-stylesheet href="AO_Test_Min.xsl" type="text/xsl"?>
<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>
--------------------------------------------------
I wish this output:
--------------------------------------------------
Teacher's Leader: X
1. Price: 70.
teacher: X class: 1 shift: 1 Pay: All
teacher: na class: 2 shift: Pay: All
2. Price: 170.
teacher: X class: 1 shift: 1 Pay: All
teacher: X class: 2 shift: Pay: All
Teacher's Leader: Z
1. Price: 100.
teacher: Z class: 1 shift: 1 Pay: All
teacher: Z class: 2 shift: Pay: All
Credit Offer
1. Price: 100.
teacher: X class: 1 shift: 0 Pay: Credit
teacher: X class: 2 shift: Pay: Credit
2. Price: 200.
teacher: Z class: 1 shift: 0 Pay:
teacher: na class: 2 shift: Pay:
Teacher's Leader: Y
1. Price: 150.
teacher: Y class: 1 shift: 1 Pay: Basic
teacher: Y class: 2 shift: Pay: Basic
--------------------------------------------------
But I have this output:
--------------------------------------------------
Credit Offer
1. Price: 100.
teacher: X class: 1 shift: 0 Pay: Credit
teacher: X class: 2 shift: Pay: Credit
2. Price: 200.
teacher: Z class: 1 shift: 0 Pay:
teacher: na class: 2 shift: Pay:
Teacher's Leader: X
1. Price: 70.
teacher: X class: 1 shift: 1 Pay: All
teacher: na class: 2 shift: Pay: All
2. Price: 170.
teacher: X class: 1 shift: 1 Pay: All
teacher: X class: 2 shift: Pay: All
Teacher's Leader: Y
1. Price: 150.
teacher: Y class: 1 shift: 1 Pay: Basic
teacher: Y class: 2 shift: Pay: Basic
Teacher's Leader: Z
1. Price: 100.
teacher: Z class: 1 shift: 1 Pay: All
teacher: Z class: 2 shift: Pay: All
--------------------------------------------------
My problem lies on can’t establish a new group over node “course[1]/teacher”.
The Objectives are:
This is language’s teacher board offer. 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.
Thanks for your help, in advance.
Gabriel