xsl-list
[Top] [All Lists]

AW: Grouping in XSLT 2.0 with multiple grouping levels

2005-02-01 05:15:45
Hi,

Thank you very much, Michael.
I am really looking forward diving into it :)
This example is exactly what I need.
Do you now where I can find other complex
examples of positional grouping in XSLT 2.0?

wbr,
Roman 

-----Ursprüngliche Nachricht-----
Von: Michael Kay [mailto:mike(_at_)saxonica(_dot_)com] 
Gesendet: Dienstag, 1. Februar 2005 12:47
An: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Betreff: RE: [xsl] Grouping in XSLT 2.0 with multiple grouping levels

One way to do this in a generalized mechanism is to write a 
recursive grouping template and have the actual grouping 
criteria table-driven. I've done this before (several times) 
with value-based grouping, but not with positional grouping:

<xsl:variable name="levels"
   as="xs:string*" 
   select="'^41_UeberschrG1$', '^43_UeberschrG2$', '_NovAo.', 
'_Strich',
  '_Litera', '_Sublitera', '_Ziffer'"/>

<xsl:template name="group">
  <xsl:param name="level" as="xs:integer"/>
  <xsl:param name="population" as="node()*"/>
  <xsl:for-each-group select="$population"
     group-starting-with="*[matches(local-name(.), $levels[$level])]">
    <xsl:variable name="x" as="node()*">
     <xsl:choose>
      <xsl:when test="matches(local-name(.), $levels[$level])">
        <xsl:copy>
          <xsl:copy-of select="@*"/>
          <xsl:copy-of select="current-group() except ."/>
        </xsl:copy>
      </xsl:when>
      <xsl:otherwise>
          <xsl:copy-of select="current-group()"/>
      </xsl:otherwise>
     </xsl:choose>
    </xsl:variable>
    <xsl:choose>
      <xsl:when test="$level = count($levels)">
        <xsl:sequence select="$x"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:call-template name="group">
          <xsl:with-param name="level" select="$level + 1"/>
          <xsl:with-param name="population" select="$x"/>
        </
      </
    </
  </
</

Not tested, and I don't really know whether I've understood 
the problem correctly, but perhaps it gives you some ideas as 
to what's achievable. 

(In this case the table of grouping keys is represented by a 
sequence of regular expressions. In another one I did, it was 
a sequence of XPath expressions, evaluated using saxon:evaluate).

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

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

Ok, I'll try to explain the rules:

* The following elements must start a new group: 
41_UeberschrG1, 43_UeberschrG2, *_NovAo*, *_Strich*, *_Litera*, 
*_Sublitera*, *_Ziffer*
    (* is used as wildcard)

    Logical Structur: 41_UeberschrG1
                            |_ 43_UeberschrG2
                                    |_ *_NovAo*
                                            |_ *_Ziffer*
                                                    |_ *_Litera*
                                                            
|_ *_Sublitera*
                                                            
    |_ *_Strich*
                            
* All elements before the first element to be grouped 
should stay as 
they are
* Each grouping level is "optional". That means that there 
may appear 
an litera as child of NovAo,...
* the elements 68_UnterschrL and 69_UnterschrM must not be 
included in 
any group

There are other rules, but they are a little bit difficult 
to explain 
here. But I am sure that I can adapt any solutions to my needs.
Thank you very much for your patience!

wbr,
Roman
_______________________________________

Roman Huditsch
IT and Electronic Publishing
LexisNexis ARD Orac
Marxergasse 25
1030 Vienna
Austria
ph: +43-1-534 52-1514
f: +43-1-534 52-140
e-mail roman(_dot_)huditsch(_at_)lexisnexis(_dot_)at
www.lexisnexis.at
 

-----Ursprüngliche Nachricht-----
Von: Michael Kay [mailto:mike(_at_)saxonica(_dot_)com]
Gesendet: Dienstag, 1. Februar 2005 10:42
An: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Betreff: RE: [xsl] Grouping in XSLT 2.0 with multiple
grouping levels

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




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