0
votes

I have a problem nesting the result tags in each other the right way. The result should look like this:

aimed result

<categoryA>
  <position>...</position>
  <position>...</position>
  ...
</categoryA>
<categoryB>
  <position>...</position>
  <position>...</position>
  ...
</categoryB>

currently I have only managed to get the right results for the positions, the categoryA and B are 1 hierarchic layer higher than the positions. the positions should be nested in the categories. The categories can be referenced by let $y := $d/Bilanz/Aktiva/* (respectively $d$d/Bilanz/Aktiva/LangfristigesVermoegen and $d$d/Bilanz/Aktiva/KurzfristigesVermoegen).

Here is my query:

query

let $d := doc('http://etutor.dke.uni-linz.ac.at/etutor/XML?id=5001')/Bilanzen

let $a02 := $d/Bilanz[@jahr='2002']/Aktiva/*
let $a03 := $d/Bilanz[@jahr='2003']/Aktiva/*

for $n02 in $a02//* , $n03 in $a03//*

  (:
  where name($n02) = name($n03)
  where node-name($n02) = node-name($n03)
  :)

where name($n02) = name($n03)

return <position name="{node-name($n02)}"> 
<j2002>{data($n02/@summe)}</j2002>
<j2003>{data($n03/@summe)}</j2003>
<diff>{data($n03/@summe) - data($n02/@summe)}</diff>
</position>

xml

<Bilanzen>
    <Bilanz jahr="2002">
        <Aktiva>
            <LangfristigesVermoegen>
                <Sachanlagen summe="1486575.8"/>
                <ImmateriellesVermoegen summe="67767.2"/>
                <AssoziierteUnternehmen summe="190826.3"/>
                <AndereBeteiligungen summe="507692.7"/>
                <Uebrige summe="92916.4"/>
            </LangfristigesVermoegen>
            <KurzfristigesVermoegen>
                <Vorraete summe="78830.9"/>
                <Forderungen summe="198210.3"/>
                <Finanzmittel summe="181102.0"/>
            </KurzfristigesVermoegen>
        </Aktiva>
        <Passiva>
            <Eigenkapital>
                <Grundkapital summe="91072.4"/>
                <Kapitalruecklagen summe="186789.5"/>
                <Gewinnruecklagen summe="798176.2"/>
                <Bewertungsruecklagen summe="-34922.4"/>
                <Waehrungsumrechnung summe="0"/>
                <EigeneAktien summe="0"/>
            </Eigenkapital>
            <AnteileGesellschafter summe="23613.1"/>
            <LangfristigeVerb>
                <Finanzverbindlichkeiten summe="680007.1"/>
                <Steuern summe="36555.8"/>
                <Rueckstellungen summe="429286.1"/>
                <Baukostenzuschuesse summe="169246.0"/>
                <Uebrige summe="36166.9"/>
            </LangfristigeVerb>
            <KurzfristigeVerb>
                <Finanzverbindlichkeiten summe="14614.6"/>
                <Steuern summe="65247.6"/>
                <Lieferanten summe="94939.2"/>
                <Rueckstellungen summe="123664.8"/>
                <Uebrige summe="89464.8"/>
            </KurzfristigeVerb>
        </Passiva>
    </Bilanz>
    <Bilanz jahr="2003">
        <Aktiva>
            <LangfristigesVermoegen>
                <Sachanlagen summe="1590313.7"/>
                <ImmateriellesVermoegen summe="69693.2"/>
                <AssoziierteUnternehmen summe="198224.7"/>
                <AndereBeteiligungen summe="418489.3"/>
                <Uebrige summe="104566.7"/>
            </LangfristigesVermoegen>
            <KurzfristigesVermoegen>
                <Vorraete summe="20609.8"/>
                <Forderungen summe="289458.5"/>
                <Finanzmittel summe="302445.9"/>
            </KurzfristigesVermoegen>
        </Aktiva>
        <Passiva>
            <Eigenkapital>
                <Grundkapital summe="91072.4"/>
                <Kapitalruecklagen summe="186789.5"/>
                <Gewinnruecklagen summe="875723.4"/>
                <Bewertungsruecklagen summe="-15459.5"/>
                <Waehrungsumrechnung summe="-633.7"/>
                <EigeneAktien summe="0"/>
            </Eigenkapital>
            <AnteileGesellschafter summe="22669.8"/>
            <LangfristigeVerb>
                <Finanzverbindlichkeiten summe="733990.2"/>
                <Steuern summe="68156.8"/>
                <Rueckstellungen summe="395997.2"/>
                <Baukostenzuschuesse summe="177338.5"/>
                <Uebrige summe="38064.9"/>
            </LangfristigeVerb>
            <KurzfristigeVerb>
                <Finanzverbindlichkeiten summe="6634.7"/>
                <Steuern summe="97119.1"/>
                <Lieferanten summe="89606.0"/>
                <Rueckstellungen summe="128237.5"/>
                <Uebrige summe="98495.2"/>
            </KurzfristigeVerb>
        </Passiva>
    </Bilanz>
 </Bilanzen>

I would really appreciate some help, i have no clue at all. Thank you.

1
What actually you want to get. Please describe clearly - Navin Rawat

1 Answers

0
votes

If I understand you correctly, you want the information about LangfristigesVermoegen (and its children) to be grouped in the output under element categoryA, and the information about Kurzfristigesvermoegen to be grouped under categoryB.

So you will want first of all to do something to generate the categoryA and categoryB elements. For example,

let $d := doc(...)/Bilanzen
return (
  <categoryA>{ ... children of category A here ... }</categoryA>,
  <categoryB>{ ... children of category B here ... }</categoryB>
)

The positions in each category can be generated using code similar to what you've now got, except that instead of iterating over

for $n02 in $a02//* , $n03 in $a03//*

you will need to iterate over $a02[self::LangfristigesVermoegen]/* for category A, and over $a02[self::KurzfristigesVermoegen]/* for category B (and similarly, of course, for $n02 and $n03).

If the set of categories is not static and you just want to group things in the output using the same grouping elements present in the input, then you'll want an outer structure something like this:

for $assetclass1 in $anno2002/*
let $assetclass2 := $anno2003/*[name() = name($assetclass1)]
return
(element {name($assetclass1)} {
  for $old in $assetclass1/*,
      $new in $assetclass2/*
  where name($old) eq name($new)
  return <position name="{node-name($old)}"> 
    <j2002>{data($old/@summe)}</j2002>
    <j2003>{data($new/@summe)}</j2003>
    <diff>{data($new/@summe) - data($old/@summe)}</diff>
  </position>
})