xsl-list
[Top] [All Lists]

Grouping in XSLT 2.0 with multiple grouping levels

2005-02-01 01:24:03
Hi,

Ok, I'll do my best in trying to explain my use case.

I have to transform source files produced via the Upcast conversion tool 
into XML files valid to a given XML Schema.
My input files have a flat and arbitrary structure.

Here is a sample input file:

<?xml version="1.0" encoding="ISO-8859-1"?>
<document>
        <part style="page: pageStyle1;">
                <section level="1">
                        <heading class="02_BDGesBlatt" 
level="1">bundesgesetzblatt</heading>
                        <par class="03_RepOesterr">für die republik 
österreich</par>
                        <par class="04_AusgabeDaten">Jahrgang 2004 Ausgegeben 
am 30. Dezember 2004 Teil I</par>
                        <par class="05_Kurztitel">180. Bundesgesetz: <inline 
style="color: #000000;">Abgabenänderungsgesetz 2004 - AbgÄG 2004</inline>
                        </par>
                        <par class="05_Kurztitel">(NR: GP XXII RV 686 AB 734 S. 
89. BR: 7160 AB 7184 S. 717.)</par>
                        <par class="05_Kurztitel">[CELEX-Nr.: 32003L0030, 
32003L0096]</par>
                        <par class="11_Titel" style="color: #000000; ">180. 
Bundesgesetz, mit dem das Einkommensteuergesetz 1988, das 
Körperschaftsteuergesetz 1988, das Umgründungssteuergesetz, das 
Umsatzsteuergesetz 1994, das Gesundheits- und 
Sozialbereich-Beihilfengesetz 1996, das Internationale Steuervergütungsgesetz, 
das Gebührengesetz 1957, das Konsulargebührengesetz 1992, das 
Investmentfondsgesetz 1993, das EU-Quellensteuergesetz, das EG-Amtshilfegesetz, 
das Normverbrauchsabgabegesetz, das Mineralölsteuergesetz 1995, das 
Kommunalsteuergesetz 1993, das Neugründungs-Förderungsgesetz, die 
Bundesabgabenordnung, das Abgabenverwaltungsorganisationsgesetz, das 
Zollrechts-Durchführungsgesetz, das Finanzstrafgesetz, das 
Bewertungsgesetz 1955, das Erbschafts- und Schenkungssteuergesetz 1955 sowie 
das Bundesbahngesetz geändert werden (Abgabenänderungsgesetz 2004 - 
AbgÄG 2004)</par>
                        <par class="12_PromKl_EinlSatz">Der Nationalrat hat 
beschlossen:</par>
                        <par class="42_UeberschrG1-">Artikel I</par>
                        <par class="43_UeberschrG2">Änderung des 
Einkommensteuergesetzes 1988</par>
                        <par class="12_PromKl_EinlSatz">Das 
Einkommensteuergesetz 1988, BGBl. Nr. 400, zuletzt geändert durch das 
Bundesgesetz BGBl. I Nr. 57/2004, wird wie folgt geändert:</par>
                        <par class="21_NovAo1">1. In § 3 Abs. 1 Z 17 wird 
folgender Satz angefügt:</par>
                        <par class="23_Satz_(nach_Novao)">"Gutscheine für 
Mahlzeiten bleiben bis zu einem Wert von 4,40 Euro pro Arbeitstag steuerfrei, 
wenn die Gutscheine nur am Arbeitsplatz oder in einer nahe gelegenen Gaststätte 
zur dortigen Konsumation eingelöst werden. Können die Gutscheine auch zur 
Bezahlung von Lebensmitteln verwendet werden, die nicht sofort konsumiert 
werden müssen, sind sie bis zu einem Betrag von 1,10 Euro pro Arbeitstag 
steuerfrei."</par>
                        <par class="14_Abs">In der Novelle 1839 wird der Inhalt 
nich geändert.</par>
                        <par class="22_NovAo2">2. In § 4 Abs. 4 Z 5 tritt an 
die Stelle der Wortfolge <inline class="992_Normal">"der 
Finanzlandesdirektion"</inline> die Wortfolge <inline class="992_Normal">"des 
Finanzamtes Wien 1/23"</inline>.</par>
                        <par class="21_NovAo1">3. § 4 Abs. 4 Z 7 lautet:</par>
                        <par class="52_Ziffer_e1">"7.Aufwendungen für Aus- und 
Fortbildungsmaßnahmen im Zusammenhang mit der vom Steuerpflichtigen ausgeübten 
oder einer damit verwandten beruflichen Tätigkeit und Aufwendungen für 
umfassende Umschulungsmaßnahmen, die auf eine tatsächliche Ausübung eines 
anderen Berufes abzielen. Aufwendungen für Nächtigungen sind jedoch höchstens 
im Ausmaß des den Bundesbediensteten zustehenden Nächtigungsgeldes der 
Höchststufe bei Anwendung des § 13 Abs. 7 der Reisegebührenvorschrift zu 
berücksichtigen."</par>
                        <par class="68_UnterschrL" xml:lang="en" 
style="word-break-inside: hyphenate; ">Fischer</par>
                        <par class="68_UnterschrL" xml:lang="en" 
style="word-break-inside: hyphenate; ">Schüssel</par>
                </section>
        </part>
</document>


Ok, so far so good. Having such an input file, I need to group various elements 
(with <xsl:for-each-group starting-with>).

At the end I would like to get a file like:

<document>
        <part style="page: pageStyle1;">
                <section level="1">
                        <heading class="02_BDGesBlatt" 
level="1">bundesgesetzblatt</heading>
                        <par class="03_RepOesterr">für die republik 
österreich</par>
                        <par class="04_AusgabeDaten">Jahrgang 2004 Ausgegeben 
am 30. Dezember 2004 Teil I</par>
                        <par class="05_Kurztitel">180. Bundesgesetz: <inline 
style="color: #000000;">Abgabenänderungsgesetz 2004 - AbgÄG 2004</inline>
                        </par>
                        <par class="05_Kurztitel">(NR: GP XXII RV 686 AB 734 S. 
89. BR: 7160 AB 7184 S. 717.)</par>
                        <par class="05_Kurztitel">[CELEX-Nr.: 32003L0030, 
32003L0096]</par>
                        <par class="11_Titel" style="color: #000000; ">180. 
Bundesgesetz, mit dem das Einkommensteuergesetz 1988, das 
Körperschaftsteuergesetz 1988, das Umgründungssteuergesetz, das 
Umsatzsteuergesetz 1994, das Gesundheits- und 
Sozialbereich-Beihilfengesetz 1996, das Internationale Steuervergütungsgesetz, 
das Gebührengesetz 1957, das Konsulargebührengesetz 1992, das 
Investmentfondsgesetz 1993, das EU-Quellensteuergesetz, das EG-Amtshilfegesetz, 
das Normverbrauchsabgabegesetz, das Mineralölsteuergesetz 1995, das 
Kommunalsteuergesetz 1993, das Neugründungs-Förderungsgesetz, die 
Bundesabgabenordnung, das Abgabenverwaltungsorganisationsgesetz, das 
Zollrechts-Durchführungsgesetz, das Finanzstrafgesetz, das 
Bewertungsgesetz 1955, das Erbschafts- und Schenkungssteuergesetz 1955 sowie 
das Bundesbahngesetz geändert werden (Abgabenänderungsgesetz 2004 - 
AbgÄG 2004)</par>
                        <par class="12_PromKl_EinlSatz">Der Nationalrat hat 
beschlossen:</par>
                        
                        <42_UeberschrG1>
                                <titel>Artikel I</titel>
                                <43_UeberschrG2>
                                        <titel>Änderung des 
Einkommensteuergesetzes 1988</titel>
                                        <par class="12_PromKl_EinlSatz">Das 
Einkommensteuergesetz 1988, BGBl. Nr. 400, zuletzt geändert durch das 
Bundesgesetz BGBl. I Nr. 57/2004, wird wie folgt geändert:</par>
                                        <NovAo>
                                                <absatz>1. In § 3 Abs. 1 Z 17 
wird folgender Satz angefügt:</absatz>
                                                
<23_Satz_(nach_Novao)>"Gutscheine für Mahlzeiten bleiben bis zu einem Wert von 
4,40 Euro pro Arbeitstag steuerfrei, wenn die Gutscheine nur am Arbeitsplatz 
oder in einer nahe gelegenen Gaststätte zur dortigen Konsumation eingelöst 
werden. Können die Gutscheine auch zur Bezahlung von Lebensmitteln verwendet 
werden, die nicht sofort konsumiert werden müssen, sind sie bis zu einem Betrag 
von 1,10 Euro pro Arbeitstag steuerfrei."</23_Satz_(nach_Novao)>
                                        </NovAo>
                                        <par class="14_Abs">In der Novelle 1839 
wird der Inhalt nich geändert.</par>
                                        <NovAo>
                                                <absatz>2. In § 4 Abs. 4 Z 5 
tritt an die Stelle der Wortfolge <inline class="992_Normal">"der 
Finanzlandesdirektion"</inline> die Wortfolge <inline class="992_Normal">"des 
Finanzamtes Wien 1/23"</inline>.</absatz>
                                        </NovAo>
                                        <NovAo>
                                                <absatz>3. § 4 Abs. 4 Z 7 
lautet:</absatz>
                                                <52_Ziffer_e1>"7.Aufwendungen 
für Aus- und Fortbildungsmaßnahmen im Zusammenhang mit der vom 
Steuerpflichtigen ausgeübten oder einer damit verwandten beruflichen Tätigkeit 
und Aufwendungen für umfassende Umschulungsmaßnahmen, die auf eine tatsächliche 
Ausübung eines anderen Berufes abzielen. Aufwendungen für Nächtigungen sind 
jedoch höchstens im Ausmaß des den Bundesbediensteten zustehenden 
Nächtigungsgeldes der Höchststufe bei Anwendung des § 13 Abs. 7 der 
Reisegebührenvorschrift zu berücksichtigen."<52_Ziffer_e1>
                                        </NovAo>
                                </43_UeberschrG2>
                        </42_UeberschrG1>
                        <par class="68_UnterschrL" xml:lang="en" 
style="word-break-inside: hyphenate; ">Fischer</par>
                        <par class="68_UnterschrL" xml:lang="en" 
style="word-break-inside: hyphenate; ">Schüssel</par>
                </section>
        </part>
</document>



All elements in the source document containing "NovAo" should be treated 
identically. 
There are of course other elements which need to be grouped, but for a better 
understanding
I have put them out of the source file.

I managed to come up with a working version, but I am sure there are a lot of 
problems in it.
I decided to split up the entire transformation in multiple stylesheets where 
each of them groups
another element. I thought that would be best because I can't rely on any 
element existing in my 
source document and some elements like "NovAo" need special care. 

How would you deal with such requirements?
How should a stylesheet doing such transformations look like?
I first tried to write a template for "section" and do the grouping there,
but that didn't work out, since I don't want every child element to be 
grouped...

Every help is very much appreciated!

I first wanted to send you one of my stylesheets, 
but I am doing other element conversions as well, so it
wouldn't produce the simple structure shown above...

wbr,
Roman

-----Ursprüngliche Nachricht-----
Von: Michael Kay [mailto:mike(_at_)saxonica(_dot_)com] 
Gesendet: Dienstag, 1. Februar 2005 01:08
An: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Betreff: RE: [xsl] from start tag A to end tag B

Is there any resource showing some sophisticated grouping solutions 
using XSLT 2.0?
I just take a look at Michael's XSLT 2.0 reference, but I need some 
examples with a more complex and felxible structure...

I think you need to post a problem and we'll see what we can 
do to provide a solution.

I could write an essay on recursive grouping but it might be 
addressing a problem that you haven't got...

Michael Kay
http://www.saxonica.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>
--~--



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