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(_at_)gbormans(_dot_)telenet(_dot_)be]
Sent: Sunday, March 17, 2013 6:11 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--