Announcement

Collapse
No announcement yet.

Teiler einer XML mehrfach in unterschiedlichen Tempaltes verwenden

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

  • Teiler einer XML mehrfach in unterschiedlichen Tempaltes verwenden

    Hi,

    ich stehe vor der Aufgabe, eine XML so zu formatieren, dass sich bestimmte Daten auf meheren Seiten befinden.

    z.B.:

    Users->user->name

    der Name aller in der xml vorkommendne User soll einmal auf der ersten seite meiner pdf (mittels xsl:fo) angezeigt werden, und auf einer späteren sollen alle daten zu einem user (email, name, bday, etc.) mit hilfe eines anderen templates nochmal angezeigt werden.

    Ich habe versucht dies über ein named template zu lösen und mittels call in der jeweiligen page-sequence dann das entsprechende template einzubindne, aber sagt mir immer:
    xsl:call-templates ist an dieser Position in der Formatvorlage nicht zulässig!
    ich nutze zum parsen apache fop.

    ist es nicht möglich gewisse knoten an unterschiedlichen stellen nochmals auszugeben!? mit unterschiedlichen templates?

    Danke für eure hilfe

  • #2
    Der übliche Weg zur mehrfachen Verabeitung von Knoten ist die Benutzung von "modes", also etwa
    Code:
    <xsl:template match="/">
      <root>
        <xsl:apply-templates select="Users" mode="m1"/>
        <xsl:apply-templates select="Users" mode="m2"/>
      </root>
    </xsl:template>
    
    <xsl:template match="Users" mode="m1">
      <ul>
        <xsl:apply-templates select="User" mode="m1"/>
      </ul>
    </xsl:template>
    
    <xsl:template match="User" mode="m1">
      <li>
        <xsl:value-of select="Name"/>
      </li>
    </xsl:template>
    
    <xsl:template match="Users" mode="m2">
      <table>
        <tbody>
          <xsl:apply-templates select="User" mode="m2"/>
       </tbody>
      </table>
    </xsl:template>
    
    <xsl:template match="User" mode="m2">
      <tr>
        <xsl:apply-templates select="Name | Email" mode="m2"/>
      </tr>
    </xsl:template>
    
    <xsl:template match="Name | Email" mode="m2">
      <td>
        <xsl:value-of select="."/>
      </td>
    </xsl:template>
    Was die Fehlermeldung zu xsl: call-template angeht, du wirst uns den nötigen Kontext im Stylesheet zeigen müssen, um eine Erklärung zu bekommen, warum der Prozessor sich über die verwendete Position beschwert. Wenn die Fehlermeldung wirklich "call-templates" statt "call-template" enthält, dann ist es lediglich ein Tippfehler im Stylesheet, die Anweisung heißt "call-template" ("template" im Singular), nicht "call-templates".

    Comment


    • #3
      wow, danke für die schnelle und ausführliche antwort!

      ich hab in allen bisherigen tutorials, beispielen und dokus nirgends das mode gesehen -.-!
      das ist echt genial.

      Das mit dem call hat sich auch gleich erledigt, weils am "s" lag -.- wo kam das denn bitte her?

      Ich glaub ich werd aber alles über das mode-attribute machen. sieht für mcih schöner aus und ich kann gleich den selector nutzen!

      Danke nochmals!

      Comment

      Working...
      X