Announcement

Collapse
No announcement yet.

Frage zu position() in XSLT

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

  • Frage zu position() in XSLT

    Hallo zusammen!

    Ich würde bei folgendem XML-Beispiel

    Code:
    <a>
    	<b>
    		<titel>Titel</titel>
    		<utitel>Untertitel</utitel>
    		<c>Das ist das erste c-Element</c>
    		<c>Das ist das zweite c-Element</c>
    		<d>Ein d-Element</d>
    		<c>Das dritte c-Element</c>
    		<d>Ein d-Element</d>
    	</b>
    	<b>
    		<titel>Titel</titel>
    		<c>Das ist das erste c-Element</c>
    		<d>Ein d-Element</d>
    		<c>Das ist das zweite c-Element</c>
    		<c>Das dritte c-Element</c>
    		<d>Ein d-Element</d>
    		<c>Das vierte c-Element</c>
    	</b>
    </a>
    gerne feststellen, das wievielte <c> das aktuelle c-Element innerhalb von <b> ist...

    Mit

    Code:
    	<xsl:template match="c">
    		<c>
    			<xsl:value-of select="position()"/>
    			<xsl:text> = </xsl:text>
    			<xsl:value-of select="."/>
    		</c>
    	</xsl:template>
    erhalte ich das Ergebnis

    Code:
    <c>3 = Das ist das erste c-Element</c>
    <c>4 = Das ist das zweite c-Element</c>
    <c>6 = Das dritte c-Element</c>
    <c>2 = Das ist das erste c-Element</c>
    <c>4 = Das ist das zweite c-Element</c>
    <c>5 = Das dritte c-Element</c>
    <c>7 = Das vierte c-Element</c>
    Was muss ich ändern, damit das Ergebnis so aussieht:

    Code:
    <c>1 = Das ist das erste c-Element</c>
    <c>2 = Das ist das zweite c-Element</c>
    <c>3 = Das dritte c-Element</c>
    <c>1 = Das ist das erste c-Element</c>
    <c>2 = Das ist das zweite c-Element</c>
    <c>3 = Das dritte c-Element</c>
    <c>4 = Das vierte c-Element</c>
    Geht das nur mit einer for-each-Schleife, also mit <xsl:template match="b"> und <xsl:for-each select="c">.
    Aus verschiedenen Gründen würde ich es gerne ohne for-each-Schleife machen.
    Gibt es eine Möglichkeit, im Template festzustellen, das wievielte <c> das aktuelle Element innerhalb von <b> ist?

    Gruß, Peter

  • #2
    Hallo,

    du musst einfach nur die Geschwisterknoten mit dem Namen "c" auf der preceding-sibling-Achse zählen, z.B. so:
    Code:
    <c>
      <xsl:value-of select="concat(1 + count(preceding-sibling::c),' = ',.)" />
    </c>

    Comment


    • #3
      Es empfiehlt sich aus meiner Sicht,
      Code:
      <xsl:value-of select="position()"/>
      durch
      Code:
      <xsl:number/>
      zu ersetzen.

      position() im Template für "c" würde nur funktionieren, wenn man
      Code:
      <xsl:template match="b"><xsl:apply-templates select="c"/></xsl:template>
      benutzt.

      Comment


      • #4
        Vielen Dank für die hilfreichen Antworten!

        Comment

        Working...
        X