Subject: Re: [xsl] Hierarchy to Flat Structure From: Geert Bormans <geert@xxxxxxxxxxxxxxxxxxx> Date: Sun, 17 Mar 2013 11:14:17 +0100 |
And you will love this, the XSLT2 solution... worth considering, no?
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="Cases/Cases"> <Cases> <xsl:for-each-group select="*" group-starting-with="Category"> <Case> <xsl:copy-of select="current-group()"></xsl:copy-of> </Case> </xsl:for-each-group> </Cases> </xsl:template>
I am trying to add hierarchy to a flat structure and have it basically working. But I am wondering if there is a way to generalize the children that I am adding. Hopefully an example will help illustrate what I am doing.
Input:
<Cases> <Cases> <Category>Category One</Category> <CaseTitle>Category One Title</CaseTitle> <Institution>Category One Institution</Institution > <Author>Category One Author</Author> <History>Category One History</History> <Category>Category Two</Category> <CaseTitle>Category Two Title</CaseTitle> <Institution>Category Two Institution</Institution > <Author>Category Two Author</Author> <History>Category Two History</History> </Cases> </Cases>
Output:
<Cases> <Case> <Category>Category One</Category> <CaseTitle>Category One Title</CaseTitle> <Institution>Category One Institution</Institution > </Case> <Case> <Category>Category Two</Category> <CaseTitle>Category Two Title</CaseTitle> <Institution>Category Two Institution</Institution > </Case> </Cases>
Stylesheet:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" />
<xsl:template match="Cases/Cases"> <Cases> <xsl:apply-templates select="Category" /> </Cases> </xsl:template>
<xsl:template match="Category"> <Case> <Category><xsl:value-of select="." /></Category> <xsl:apply-templates select="following-sibling::CaseTitle [generate-id(preceding-sibling::Category[1]) = generate-id(current())]" /> <xsl:apply-templates select="following-sibling::Institution [generate-id(preceding-sibling::Category[1]) = generate-id(current())]" /> </Case> </xsl:template>
<xsl:template match="CaseTitle"> <xsl:copy-of select="." /> </xsl:template>
<xsl:template match="Institution"> <xsl:copy-of select="." /> </xsl:template>
</xsl:stylesheet>
I have template rules for each of the following siblings of Category and I can add more for Author, etc., but it seems like there should be a way to generalize this for any number of elements. Any help would be appreciated.
Rick
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Hierarchy to Flat Structu, Geert Bormans | Thread | RE: [xsl] Hierarchy to Flat Structu, Rick Quatro |
Re: [xsl] Hierarchy to Flat Structu, Geert Bormans | Date | RE: [xsl] Hierarchy to Flat Structu, Rick Quatro |
Month |