[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: XSLT 1: From flat XML to tree hierarchy XML. Can't
I'm afraid I'm not following what you want done with the namespaces, but in general I think that if you are stuck doing this in XSLT 1.0 you can achieve your goal of emitting a tree from a flat list by using the Muenchian grouping technique: http://www.jenitennison.com/xslt/grouping/muenchian.html I'm dashing this off before I head to work, so apologies if it isn't as complete as you spec out. I *think* it does what you want in terms of the tree structure. Apologies if I've misunderstood what you are after! <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:abel="http://something.com"> <xsl:output indent="yes" /> <!-- table-by-category lets us look up all tableName elements matching a category --> <xsl:key name="table-by-category" match="abel:tableName" use="@category-name" /> <!-- At the root of our output tree emit the tableName for 'Root' --> <xsl:template match="/"> <xsl:element name="abel:tree"> <xsl:attribute name="id">0</xsl:attribute> <!-- process the first tableName with a category-name matching 'Root' --> <xsl:apply-templates select="//abel:tableName[@category-name='Root'][1]" /> </xsl:element> </xsl:template> <!-- Process each 1st tableName by emitting an item and then processing its descendents and then its children. --> <xsl:template match="abel:tableName[generate-id(.)=generate-id(key('table-by-category', @category-name)[1])]"> <xsl:element name="abel:item"> <xsl:attribute name="text"> <xsl:value-of select="string(.)" /> </xsl:attribute> <xsl:attribute name="id"> <xsl:choose> <xsl:when test="@id"> <xsl:value-of select="@id" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="@category-name" /> </xsl:otherwise> </xsl:choose> </xsl:attribute> <!-- process each 1st tableName which has a parent-category-name matching our category-name --> <xsl:apply-templates select="//abel:tableName [@category-parent-name=current()/@category-name] [generate-id(.)=generate-id(key('table-by-category', @category-name)[1])]" /> <!-- process all other tableName entries with the same category-name --> <xsl:apply-templates select="key('table-by-category',@category-name)[position() != 1]" /> </xsl:element> </xsl:template> <!-- Catch-all rule to emit an item for each tableName, not processing any children or siblings. --> <xsl:template match="abel:tableName"> <xsl:element name="abel:item"> <xsl:attribute name="text"> <xsl:value-of select="string(.)" /> </xsl:attribute> <xsl:attribute name="id"> <xsl:choose> <xsl:when test="@id"> <xsl:value-of select="@id" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="@category-name" /> </xsl:otherwise> </xsl:choose> </xsl:attribute> </xsl:element> </xsl:template> </xsl:stylesheet> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - James A. Robinson jim.robinson@xxxxxxxxxxxx Stanford University HighWire Press http://highwire.stanford.edu/ +1 650 7237294 (Work) +1 650 7259335 (Fax)
|
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
|