Subject: RE: [xsl] Hierarchy to Flat Structure From: "Rick Quatro" <rick@xxxxxxxxxxxxxx> Date: Sun, 17 Mar 2013 08:02:12 -0400 |
Hi Geert, Thank you very much for all your efforts with this. The sibling recursion works fine. I tried the XSLT 2 solution, but it doesn't work in my environment. I am saving XML from Windows InDesign CS6 and I am not sure what kind of processor it uses. But your solution below is excellent. Thanks again for your help. Rick -----Original Message----- From: Geert Bormans [mailto:geert@xxxxxxxxxxxxxxxxxxx] Sent: Sunday, March 17, 2013 6:11 AM To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx Subject: Re: [xsl] Hierarchy to Flat Structure Hi Rick, As I said, I would use sibling recursion. Start at the first Category element and walk the following-sibling axis, like this <?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[1]" /> </Cases> </xsl:template> <xsl:template match="Category"> <Case> <xsl:copy-of select="." /> <xsl:apply-templates select="following-sibling::*[1][not(self::Category)]" mode="in-case-siblings"/> </Case> <xsl:apply-templates select="following-sibling::Category[1]"/> </xsl:template> <xsl:template match="*" mode="in-case-siblings"> <xsl:copy-of select="." /> <xsl:apply-templates select="following-sibling::*[1][not(self::Category)]" mode="in-case-siblings"/> </xsl:template> <xsl:template match="Category" mode="in-case-siblings"/> </xsl:stylesheet> Cheers Geert At 02:57 17/03/2013, you wrote: >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 | [xsl] WorldML Filteration, Joga Singh Rawat |
Re: [xsl] Hierarchy to Flat Structu, Geert Bormans | Date | [xsl] WorldML Filteration, Joga Singh Rawat |
Month |