[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Grouping examples make my head spin
I've just started doing my first XML grouping attempt. I've been looking over three books all day, but the solution keeps eluding my grasp. I think my problem is that all the examples presented are based on non-hierarchical elements, and I don't have the knowledge to abstract the principles from them to apply it to my situation. examples: from XSLT Programmer's Refernce 2nd Edition, pg.623: <cities> <city name="Paris" country="France" /> <city name="Roma" country="Italia" /> <city name="Nice" country="France" /> ... <cities> or from XSLT and XPath on the Edge, pg 198: <transaction date="2001-03-01" type="DD" payee="TV License">8.91<transaction> <transaction date="2001-03-01" type="DD" payee="British Gas">22.00<transaction> <transaction date="2001-03-03" type="CR" payee="Client">400.00<transaction> ... My data file is hierachical: <contractors> <contractor id="x" name="A"> <contract org="1596" contract-id="89" name="SuperDuperIII"> <contractType>System</contractType> <deliverable>Application Development</deliverable> </contract> <contract org="98" contract-id="75" name="SixtySix"> <contractType>Non-system</contractType> <deliverable>Neon Routers</deliverable> </contract> </contractor> <contractor id="16" name="W"> <contract org="1596" contract-id="1365" name="Bosco"> <contractType>System</contractType> <deliverable>Application Development</deliverable> </contract> <contract org="98" contract-id="258" name="Xanadu"> <contractType>System</contractType> <deliverable>Application Development</deliverable> </contract> </contractor> </contractors> I want to outpt HTML. I want each distinct value for /contractors/contractor/contract/@org to be output exactly once, with a list (format irrelevant for the purposes of the exercise) of /contractors/contractor/@name below that, one for each contractor which has a contract with /contractors/contractor/contract/@org. I think what I need to do is get a list of unique values for /contractors/contractor/contract/@org and then loop through all instances of /contractors/contractor, checking each value of contract/@org. If I find a new value, I want to emit an HTML div element with that value, if the value has already been encountered, I want to emit an HTML div element containing the value of /contractors/contractor/@name. I have tried this template: <xsl:template name="byPO" match="*"> <xsl:for-each select="/contractors/contractor/contract"> <div>Contract Org: <xsl:value-of select="@org" /></div> <div>Immediate preceeding sibling's contract Org: <xsl:value-of select="preceding-sibling[1]/@org" /></div> </xsl:for-each> </xsl:template> but the output shows me that no /contractors/contractor/contract has an immediately preceeding sibling, which I can see is not true, so there for I am missing something in my understanding of <xsl:value-of select="preceding-sibling[1]/@org" />. As usual, all help gratefully received. Thanks. -- Charles Knell cknell@xxxxxxxxxx - email XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|