Announcement

Collapse
No announcement yet.

Durchnumerierung eines ancestor Elements

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Durchnumerierung eines ancestor Elements

    Hi,

    ich habe ein XML, das ausschnittsweise vereinfacht so aussieht:

    Code:
    <Container>
        <Id>ABC123</Id>
        <List>
            <Item>ItemOne</Item>
        </List>
        <Id>ABC456</Id>
        <List>
            <Item>ItemOne</Item>
            <Item>ItemTwo</Item>
        </List>
    </Container>
    <Container>
        <Id>XYZ321</Id>
        <List>
            <Item>AnotherOne</Item>
            <Item>AnotherTwo</Item>
        </List>
        <Id>ABC456</Id>
        <List>
            <Item>AnotherThree</Item>
        </List>
    </Container>
    Ich muß nun eine laufende Numerierung für das ancestor-Element Id generieren, damit ich später so etwas wie

    Code:
    1;ABC123;ItemOne
    2;ABC456;ItemOne
    2;ABC456;ItemTwo
    3;XYZ321;AnotherOne
    3:XYZ321;AnotherTwo
    4;ABC456;AnotherThree
    bekomme.

    Bei einer Transformation, die sich auf ancestor-Level bewegte war das noch einfach mit

    Code:
    <xsl:number value="position()"/>
    zu bewerkstelligen, als ich jedoch in einer zweiten Transformation auf Item-Level "abtauchen" mußte, klappte das natürlich nicht mehr. Ich habe dann versucht mit ancestor und position herumzuspielen, aber das schlug fehl. Letztlich fand ich dann über Google Hinweise die so etwas wie

    Code:
    count(parent::*/preceding-sibling::*) + 1
    nahelegten, aber diese Herangehensweise geht davon aus, daß die parents sich auf einer Ebene befinden und nicht wie hier innerhalb von Containern.

    Daher nun meine Frage: Wie kann ich die bisherigen Container/Id-Elemente fortlaufend durchzählen, während ich mich auf Item-Ebene befinde?

    Dank im voraus!
    --
    Cheers Vince

  • #2
    Mit Hilfe von xsl: number geht das so:
    [highlight=xml]
    <xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:strip-space elements="*"/>
    <xslutput method="text"/>

    <xsl:template match="/">
    <xsl:apply-templates select="//Item"/>
    </xsl:template>

    <xsl:template match="Item">
    <xsl:number count="Id" level="any"/>
    <xsl:value-of select="concat(';', ../preceding-sibling::Id[1], ';', ., ' ')"/>
    </xsl:template>

    </xsl:stylesheet>
    [/highlight]
    Damit wird aus
    [highlight=xml]
    <Root>
    <Container>
    <Id>ABC123</Id>
    <List>
    <Item>ItemOne</Item>
    </List>
    <Id>ABC456</Id>
    <List>
    <Item>ItemOne</Item>
    <Item>ItemTwo</Item>
    </List>
    </Container>
    <Container>
    <Id>XYZ321</Id>
    <List>
    <Item>AnotherOne</Item>
    <Item>AnotherTwo</Item>
    </List>
    <Id>ABC456</Id>
    <List>
    <Item>AnotherThree</Item>
    </List>
    </Container>
    </Root>
    [/highlight]
    dann
    Code:
    1;ABC123;ItemOne
    2;ABC456;ItemOne
    2;ABC456;ItemTwo
    3;XYZ321;AnotherOne
    3;XYZ321;AnotherTwo
    4;ABC456;AnotherThree

    Comment


    • #3
      Hi,

      wie immer mein Lebensretter - ich hatte das zwar auch mal mit xsl:number versucht,
      aber leider frühzeitig aus unerfindlichen Gründen das "any" entfernt ... oh Mann.

      Danke!

      Cheers
      Vince
      --
      Cheers Vince

      Comment

      Working...
      X