Announcement

Collapse
No announcement yet.

Attribut anhängen an ein bestimmtes Element, rest einfach kopieren

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

  • Attribut anhängen an ein bestimmtes Element, rest einfach kopieren

    Hallo,

    ich transformiere ein xhtml-dokument in ein anderes. Dabei soll einige Elemente mit einem Attribut erweitert werden und der Rest so übernommen werden.
    Dafür habe ich ein Template für das Element geschrieben:
    <xsl:template match="xf:group[@id=/xhtml:html/descendant::xs:attribute[@name='modul']/descendant::xs:enumeration/@value]">
    <xf:group xf:ref="{@id}">
    <xsl:apply-templates select="@*"/>
    <xsl:copy>
    <xsl:apply-templates/>
    </xsl:copy>
    </xf:group>
    </xsl:template>
    Allerdings kopiert er mir das Original-Element (ohne das Attribut xf:ref) als Kindknoten mit. Genau das will ich verhindern. Er soll einfach das derzeitige Element überspringen und bei den Kindern weitermachen. Aber die Templates auch auf die Kinder ausführen. Also ein <copy-of select="*"/> ist nicht geeignet.

    Um die Frage zu vereinfachen: Ich suche eine Möglichkeit ein Element aus dem Original-Dokument um ein Attribut zu erweitern und den Rest zu kopieren. Die Templates sollen aber auf die Kinder des Elements ausgeführt werden.

    Ich hoffe ich habe die Frage verständlich formuliert. Vielen Dank schon mal im Voraus.

    mfg,
    henryf
    Zuletzt editiert von henryf; 22.04.2008, 17:25.

  • #2
    Bei solchen Fragen hilft oft ein nachvollziehbares Stück des zu transformierenden XML-Dokuments.

    Comment


    • #3
      Originally posted by Thomas Meinike View Post
      Bei solchen Fragen hilft oft ein nachvollziehbares Stück des zu transformierenden XML-Dokuments.
      Ok ich konstruiere mal ein Beispiel das so ähnlich ist.
      Input:
      <hallo>
      <group>
      <bla/>
      <blubb>
      <test1/>
      </blubb>
      <test/>
      </group>
      <group>
      .
      .
      .
      </group>
      </hallo>
      Stylesheet:
      ...
      <xsl:template select="group">
      <group att="test">
      <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
      </group>
      </xsl:template>

      <xsl:template select="blubb">
      .
      .
      .
      </xsl:template>
      <xsl:template match="@*|node()">
      <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
      </xsl:template>
      ....
      Das Problem dabei ist ich bekomme als Output:
      <hallo>
      <group att="test">
      <group>
      <bla/>
      <blubb>
      <test1/>
      </blubb>
      <test/>
      </group>
      </group>
      ....
      Einmal das neue group mit dem Attribut und das alte als Kind von ihm. Aber es sollte so aussehen:
      <hallo>
      <group att="test">
      <bla/>
      <blubb>
      <test1/>
      </blubb>
      <test/>
      </group>
      ....
      Weiß jemand wie ich den gewünschte Output bekomme?

      PS: Natürlich könnte ich das Originaldok posten aber das ist zu groß und lenkt nur vom eigentlich Problem ab.

      Vielen Dank.

      mfg,
      henryf

      Comment


      • #4
        Suchst Du das?

        Code:
        <xsl:template match="group">
          <xsl:copy>
            <xsl:attribute name="att">test</xsl:attribute>
            <xsl:apply-templates select="@*|node()"/>
          </xsl:copy>
        </xsl:template>
        BTW: xsl:template kennt kein select-Attribut, xsl:apply-templates dagegen schon.

        Comment


        • #5
          Originally posted by Thomas Meinike View Post
          Suchst Du das?
          BTW: xsl:template kennt kein select-Attribut, xsl:apply-templates dagegen schon.
          äh ja meinte eigentlich match.

          Habe bereits eine Lösung gefunden:
          PHP Code:
          <xsl:template match="group">
          <
          group attr="test">
                <
          xsl:apply-templates select="@*"/>
                <
          xsl:apply-templates select="*"/>
          </
          group>
          </
          xsl:template
          Deine Lösung geht natürlich auch. Vielen Dank.

          Comment

          Working...
          X