xsl-list
[Top] [All Lists]

RE: Grouping in XSLT 2.0 with multiple grouping levels

2005-02-01 02:42:04
It's not clear what rules you are applying here. The first element that's
treated differently from the others is <42_UeberschrG1>, and you haven't
explained why. Nor have you explained why this element ends when you get to
the <68_UnterschrL> element.

To tackle this, we need some kind of description of the rules you are
applying that determine when a sequence of consecutive elements is dropped
down a level (that is, when a sequence of consecutive elements is considered
to form a group.)

Michael Kay
http://www.saxonica.com/

-----Original Message-----
From: Huditsch Roman [mailto:Roman(_dot_)Huditsch(_at_)lexisnexis(_dot_)at] 
Sent: 01 February 2005 08:24
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Grouping in XSLT 2.0 with multiple grouping levels

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>
--~--



--~------------------------------------------------------------------
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>