Announcement

Collapse
No announcement yet.

Eine echte Herausforderung

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

  • Eine echte Herausforderung

    Hallo zusammen!

    Ich möchte gern etwas erreichen, woran ich schon seit mehreren Stunden grüble. Die Aufgabe ist folgende:

    Code:
    XML vorher:
    <Container>
      <Kiste>
        <Schachtel ziel="GER">
          <Route>FRA-BEL-GER</Route>
        </Schachtel>
      </Kiste>
      <Kiste>
      </Kiste>
    </Container>
    
    XML nachher:
    <Container>
      <Kiste>
        <Schachtel ziel="GER">
          <Route>FRA-BEL-GER</Route>
          <Kosten>250</Kosten>
        </Schachtel>
        <Schachtel ziel="CZE">
        </Schachtel>
      </Kiste>
      <Kiste>
      </Kiste>
      <Notizen>
        Schachtel mit Ziel GER geht über FRA-BEL-GER und kostet 250.
      </Notizen>
    </Container>
    Ich möchte gezielt eine bestimmte Schachtel rausgreifen, diesen Tag bearbeiten und mit dessen Daten neben seinem Parent einen Geschwistertag erstellen. Ich habe dazu eine template, die auf die gemeinte Schachtel matcht. Dann habe ich versucht aus dieser template heraus ein apply-templates mit einem bestimmten modus zu starten. Das funktionierte aber nicht. Die dabei verarbeiteten Daten würden ohnehin nur in der Schachtel eingefügt und nicht weiter oben in der Hierarchie, wie ich es will, oder?

    Grüße,
    Martin

  • #2
    Es kann gut sein, dass ich nicht alles verstanden habe (speziell woher die zusätzlichen Daten kommen), aber die gesuchte Ausgabe könnte so entstehen:

    Code:
    <xsl:template match="@* | node()">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="Schachtel[@ziel='GER']">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
        <Kosten>250</Kosten>
      </xsl:copy>
      <Schachtel ziel="CZE"></Schachtel>
    </xsl:template>
    
    <xsl:template match="Container">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
        <Notizen>Schachtel mit Ziel GER geht über FRA-BEL-GER und kostet 250.</Notizen>
      </xsl:copy>
    </xsl:template>
    Zuletzt editiert von Thomas Meinike; 25.04.2008, 13:37.

    Comment


    • #3
      Die Daten in <notizen> sollen aus der Schachtel mit @ziel='GER' kommen und nur erzeugt werden, wenn eine solche Schachtel existiert.
      Ich habe probiert:
      Code:
      <xsl:template match="Schachtel[@ziel='GER']>
      
            ... Schachtel-Tag transformieren
      
        <xsl:apply-templates mode="notizen" >
          <xsl:with-param name="route" select="/Route/text()" />
        </xsl:apply-templates>
      </xsl:template>"
      
      <xsl:template mode="notizen" match="Container">
        <xsl:param name="route" select="default" />
        <xsl:element name="notizen">
           ...
        </xsl:element>
      </xsl:template>
      
      <identitytemplate...>
      Aber das kann nie die von mir gewünschte Struktur ergeben, oder?

      Comment


      • #4
        Dann ersetze das letzte von mir genannte Template durch:

        Code:
        <xsl:template match="Container[//Schachtel[@ziel='GER']]">
          <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
            <Notizen>Schachtel mit Ziel GER geht über <xsl:value-of select="//Schachtel[@ziel='GER']/Route"/> und kostet <xsl:value-of select="//Schachtel[@ziel='GER']/Kosten"/>.</Notizen>
          </xsl:copy>
        </xsl:template>
        Das Kosten-Element kommt allerdings in der geposteten Ausgangsstruktur nicht vor.

        Comment

        Working...
        X