xsl-list
[Top] [All Lists]

Re: [xsl] Hierarchy to Flat Structure

2013-03-17 05:11:07
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>
--~--

<Prev in Thread] Current Thread [Next in Thread>