BIRT Report mit XML Data-Source und Attribut-Filtern

IT-Kerl

Grünschnabel
Hallo zusammen,

ich arbeite derzeit mit BIRT und habe eine XML-Datenquelle, die stark vereinfacht den folgenden Aufbau besitzt:
Code:
<root>
   <first key="1">
      <value>A</value>
      <second key="1">
         <value>a</value>
         <third key="1">
            <value>1</value>
         </third>
         <third key="2">
            <value>2</value>
         </third>
      </second>
      <second key="2">
         <value>b</value>
         <third key="1">
            <value>1</value>
         </third>
         <third key="2">
            <value>2</value>
         </third>
      </second>
   </first>
   <first key="2">
      <value>B</value>
      <second key="1">
         <value>a</value>
         <third key="1">
            <value>1</value>
         </third>
         <third key="2">
            <value>2</value>
         </third>
      </second>
      <second key="2">
         <value>b</value>
         <third key="1">
            <value>1</value>
         </third>
         <third key="2">
            <value>2</value>
         </third>
      </second>
   </first>
</root>
Ich bin mit dem Umgang von BIRT und XML einigermaßen vertraut, daher weiß ich, dass BIRT XML-Strukturen als relationale Tabelle "interpretiert". Mir ist auch klar, dass ich mit dem Row-Mapping die Zeilen dieser Tabelle definiere und mit dem Column-Mapping eben die Spalten. Leider scheint BIRT da etwas eigenwillig zu sein.

Ziel: Ich möchte in einer Tabelle alle "first" Elemente ausgeben, in einem Subreport die untergeordneten "second"-Elemente und in einem zweiten Subreport die zugehörigen "third"-Elemente.

Daher lege ich 3 Data-Sets mit den folgenden Row-Mapping Einträgen an (ich verwende BIRT 2.5):
Für alle "first"-Elemente:
Code:
/root/first
Für alle "second"-Elemente:
Code:
{?context?}/second
Für alle "third"-Elemente:
Code:
{?context?}/third

1.) Ich erstelle eine Tabelle mit 3 Spalten. In der ersten Spalte gebe ich den Wert der Spalte "value" (des Elements "first") aus.
2.) In die zweite Spalte füge ich eine 2. Tabelle ein, die das DataSet für die "second"-Elemente enthält.
Den XML-Parameter {?context?} binde ich an die JS-Expression
Code:
"/root/first[@key=\""+row["key"]+"\"]"
3.) Die dritte Spalte erhält eine 3. Tabelle, die das DataSet für die "third"-Elemente enthält.
Den XML-Parameter {?context?} binde ich an die JS-Expression
Code:
"/root/first[@key=\""+row._outer["key"]+"\"]/second[@key=\""+row["key"]+"\"]"

Ich erwarte das Ergebnis:
Code:
Spalte 1 | Spalte 2 | Spalte 3
------------------------------
A          a          1
                      2
           b          1
                      2
B          a          1
                      2
           b          1
                      2
Aber ab dem dritten Subreport wird der XPath-Ausdruck nicht korrekt ausgewertet:
Code:
Spalte 1 | Spalte 2 | Spalte 3
------------------------------
A          a           
           b           
B          a           
           b

Ich habe bereits ein paar Varianten probiert. Es hat sich herausgestellt, dass auch ein fixes Row-Mapping mit 2 Attribut-Filtern nicht funktioniert.
Code:
/root/first[@key="2"]/second[@key="2"]/third

Es wäre wunderbar, wenn ihr eine Idee hättet...

Gruß und schöne Weihnachten!
 
Hallo,

leider hat mir keiner eine Hilfe geboten. Aber ich bin inzwischen auch zu einer Lösung für mein Problem gekommen. Ich ergänze jedes DataSet mit einer Computed-Column, die mit der Aggregatsfunktion RUNNINGCOUNT auf die aktuelle Zeilennummer innerhalb der XML-Struktur verweist. Die DataSets erhalten im Row-Mapping einen Index-Filter für jede Ebene und einen Parameter als Platzhalter. Im Sub-Report ersetzte ich den Parameter dann durch die oben genannte Zeilennummer des äußeren DataSets. Das funktioniert und ist wahrscheinlich sogar schneller als andere Hilfskonstrukte.
Beispiel:
Code:
/root/first[{?first_zeile?}]/second[{?second_zeile?}]/third

Grüße
 
Zurück