Announcement

Collapse
No announcement yet.

Wenn ein Attribut>0, soll soviel Tags wie Zahl ist erstellt werden

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

  • Wenn ein Attribut>0, soll soviel Tags wie Zahl ist erstellt werden

    Sorry ich schon wieder,
    Problem: Das Attribut number-columns-repeated kürzt 2 table-cell Tags ab. Ich möchte aber, dass die table-cells drinnen sind und dass das Attribut verschwindet. 2 bedeutet eins mehr 3, falls man das table-cell löscht.
    ansonsten sind es mit table-cell Element = 2 weitere table-cells.

    XML:
    <root>
    <table-row>
    <table-cell number-columns-repeated="2"/>
    <table-cell>test</table-cell>
    <table-cell/>
    <table-cell>test</table-cell>
    </table-row>
    <table-row>
    <table-cell>test</table-cell>
    <table-cell/>
    <table-cell>test</table-cell>
    <table-cell number-columns-repeated="3"/>
    </table-row>
    </root>

    End XML:

    <root>
    <table-row>
    <table-cell/>
    <table-cell/>
    <table-cell/>
    <table-cell>test</table-cell>
    <table-cell/>
    <table-cell>test</table-cell>
    </table-row>
    <table-row>
    <table-cell>test</table-cell>
    <table-cell/>
    <table-cell>test</table-cell>
    <table-cell/>
    <table-cell/>
    <table-cell/>
    <table-cell/>
    </table-row>
    </root>

    Hintergrund:
    Wenn ich die Abkürzungen weg habe, dann kann ich mit position() arbeiten. Ich kenne ja die Tabellengröße. Also z.B. Tabelle hat 5 Spalten [1]-[5]. Dann gäbe es keine ständigen Abfragen.

    Vielen Dank,
    Tamer

  • #2
    Hier eine XSLT 2.0-Lösung mit Identitäts-Template und Zusatzbehandlung der table-cell-Elemente, welche ein Attribut number-columns-repeated haben:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:fn="http://www.w3.org/2005/xpath-functions"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      exclude-result-prefixes="fn xs">
    
      <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    
      <xsl:template match="@* | node()">
        <xsl:copy>
          <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
      </xsl:template>
    
      <xsl:template match="table-cell[@number-columns-repeated > 0]">
        <xsl:for-each select="1 to xs:integer(@number-columns-repeated + 1)">
          <table-cell/>
        </xsl:for-each> 
      </xsl:template>
    
    </xsl:stylesheet>
    Unter XSLT 1.0 den Inline-Schleifen-Aufruf von "1 to ..." (XPath 2.0) über ein mittels xsl:call-template rekursiv aufgerufenes Template lösen [dort number() statt xs:integer() verwenden].

    Comment


    • #3
      ooh nein

      ja ich brauche eine xslt 1.0 lösung. ich hab das vergessen zu schreiben. sorry.

      ich hab das jetzt so wie du beschrieben hast versucht, aber ich bekomme einfach nicht das richtige ergebnis.

      mit 2.0 ist das viel besser. das geht.
      geht das vielleicht, wenn ich die exslt-funktionen benutze?

      kannst du mir den code für 1.0 schicken?
      thx thx

      p.s. ich habe das bei meinem ersten versuch mit einer schleife versucht. der code ist allerdings viel länger. es geht aber trotzdem nicht.

      Comment


      • #4
        Verwende unter 1.0 diesen Ansatz [number() muss hier nicht zwingend hinhein]:
        Code:
        <?xml version="1.0" encoding="UTF-8"?>
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        
          <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
        
          <xsl:template match="@* | node()">
            <xsl:copy>
              <xsl:apply-templates select="@* | node()"/>
            </xsl:copy>
          </xsl:template>
        
          <xsl:template match="table-cell[@number-columns-repeated > 0]">
            <xsl:call-template name="tc_ausgabe">
              <xsl:with-param name="akt" select="1"/>
              <xsl:with-param name="bis" select="@number-columns-repeated + 1"/>
            </xsl:call-template>
          </xsl:template>
        
          <xsl:template name="tc_ausgabe">
            <xsl:param name="akt"/>
            <xsl:param name="bis"/>
            <xsl:if test="$akt &lt;= $bis">
              <table-cell/>
              <xsl:call-template name="tc_ausgabe">
                <xsl:with-param name="akt" select="$akt + 1"/>
                <xsl:with-param name="bis" select="$bis"/>
              </xsl:call-template>
            </xsl:if>
          </xsl:template>
        
        </xsl:stylesheet>

        Comment


        • #5
          super

          vielen vielen dank. das geht einwand frei.

          toll mir wurde 2 mal riesig geholfen :-) thx

          Comment

          Working...
          X