Kara: xpath "ancestor".... Verfolgung von Attributen

Hallo,

ich habe folgendes Beispiel XML-Dokument:

<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Beispiel1>
<Versuche1>Erster Versuch</Versuche1>
</Beispiel1>
<Buch>
<Name>83</Name>
<BuchInfo>
<Erscheinung></Erscheinung>
<Verlag></Verlag>
</BuchInfo>
<Heft ID="one">
<HeftInfo>
<Name>Aufbau</Name>
<Bezeichnung></Bezeichnung>
</HeftInfo>
<HeftBody>
<Seite ID="erste" Zahl="01">
<Titel></Titel>
<HeftBody>
<Seite ID="Uno" Zahl="01">
<Titel></Titel>
<HeftBody>
<Itemlist>
<Remark ID="fuer-P1">
<Anmerkung></Anmerkung>
....
</Remark>
<Item ID="P1" Zahl="0001">
<SummeSeiten></SummeSeiten>
<Qty></Qty>
<Text></Text>
......
</Item>
</Itemlist>
</HeftBody>
</Seite>
</HeftBody>
</Seite>
<Seite ID="zweite" Zahl="02">
<Titel></Titel>
<HeftBody>
<Seite ID="Two" Zahl="01">
<Titel></Titel>
<HeftBody>
<Itemlist>
<Remark ID="fuer-P2_1">
<Anmerkung></Anmerkung>
....
</Remark>
<Item ID="P2_1" Zahl="0001">
<SummeSeiten></SummeSeiten>
<Qty></Qty>
<Text></Text>
......
</Item>
</Itemlist>
</HeftBody>
</Seite>
</HeftBody>
</Seite>
</HeftBody>
</Heft>
</Buch>
</Root>

Mit u.a. folgendem "Rule" im Template über die Elemente "Seite" und "Item" :

<xsl:value-of select="ancestor::Seite/@Zahl"/><xsl:value-of select="@Zahl"/>

habe ich versucht, folgendes Ergebnis zu erzielen:

01
0101
01010001
02
0201
02010001

Aber es klappt nicht. Da es viele Knoten dazwischen gibt, die Verfolgung der Attribute der übergeordneten Elemente "Seite" erfolgt nicht. Immer wird direkt das Attribut des ersten Elements "Seite" selektiert.
Mein Ziel ist, daß bei jedem Element "Seite" oder "Item", erst das Attribut "Zahl" der übergeordneten Elemente "Seiten" (von oben angefangen nach unten) selektiert wird und letztendlich das Attribut des aktuellen node auch selektiert wird..

Hat jemand eine Idee, wie ich das "Rule" im Template verbessern soll?

Danke

  1. Hi,

    Mit u.a. folgendem "Rule" im Template über die Elemente "Seite" und "Item" :

    <xsl:value-of select="ancestor::Seite/@Zahl"/><xsl:value-of select="@Zahl"/>

    habe ich versucht, folgendes Ergebnis zu erzielen:

    xsl:value-of liefert immer nur einen Wert. Wenn select mehrere Elemente auswählt, wird eines davon genommen.

    Du willst mehrere Werte.
    Ich würde das in etwa so lösen (Achtung, ungetesteter Code):

    <xsl:template match="@Zahl">
        <xsl:value-of select="."/> <!-- hier ggf. die zweistellige Ausgabe herstellen oder noch ein Trennzeichen anfügen -->
    </xsl:template>

    <xsl:apply-template select="ancestor::Seite/@Zahl"/><xsl:value-of select="@Zahl"/>

    Das Template wird damit auf ALLE ancestor::Seite/@Zahl angewendet, nicht nur auf eines.

    cu,
    Andreas

    --
    Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
    http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
    1. Hallo,

      leider klappt's nicht..

      01 ist O.K.
      beim zweiten Element "Seite" schreibt's 0101 auch O.K
      beim ersten Element "Item" schreibt's 010001 falsch...
      Es muss 01010001 sein....

      Hi,

      Mit u.a. folgendem "Rule" im Template über die Elemente "Seite" und "Item" :

      <xsl:value-of select="ancestor::Seite/@Zahl"/><xsl:value-of select="@Zahl"/>

      habe ich versucht, folgendes Ergebnis zu erzielen:

      xsl:value-of liefert immer nur einen Wert. Wenn select mehrere Elemente auswählt, wird eines davon genommen.

      Du willst mehrere Werte.
      Ich würde das in etwa so lösen (Achtung, ungetesteter Code):

      <xsl:template match="@Zahl">
          <xsl:value-of select="."/> <!-- hier ggf. die zweistellige Ausgabe herstellen oder noch ein Trennzeichen anfügen -->
      </xsl:template>

      <xsl:apply-template select="ancestor::Seite/@Zahl"/><xsl:value-of select="@Zahl"/>

      Das Template wird damit auf ALLE ancestor::Seite/@Zahl angewendet, nicht nur auf eines.

      cu,
      Andreas

      1. Hi,

        01 ist O.K.
        beim zweiten Element "Seite" schreibt's 0101 auch O.K
        beim ersten Element "Item" schreibt's 010001 falsch...
        Es muss 01010001 sein....

        Dann stimmt der Select wohl noch nicht, wenn zuwenig selektiert wird...

        Bitte keine Fullquotes, immer nur den Teil zitieren, auf den Du Dich beziehst...

        cu,
        Andreas

        --
        Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
        http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/