verenice: XSL / copy-of mit Parameter übergeben...

Hallo,
kann man den Inhalt von copy-of in einem Parameter speichern und dann an ein anderes Template übergeben?

Hier wird der Inhatl von dem Knoten kopiert. Das funktioniert:
<xsl:template match="KapitelRef">
<xsl:copy-of select="." />
</xsl:template>

Wenn ich aber um copy-of ein call-template und darum dann ein with-param schachtele , dann funktioniert es nicht mehr:
<xsl:template match="KapitelRef">
<xsl:call-template name="KnotenKaRefKopie">
<xsl:with-param name="pKnotenKaRefKopie" >
<xsl:copy-of select="."/>
</xsl:with-param>
</xsl:call-template>

Ich würde gern in copy-of den Inhalt von einem Knoten speichern, um den Inhalt dann in einem anderen Knoten / anderes Template weiterzubearbeiten.
Mit Variablen habe ich es auch schon probiert.
Mit globalen Variablen kann ich den Knoten nicht selektieren und mit der lokalen Variable kann ich den Inhalt nicht in einem anderen Template abrufen.

Danke schon mal im voraus für Eure Hilfe!:o)

Viele Grüße
verenice

  1. Hallo,

    kann man den Inhalt von copy-of in einem Parameter speichern und dann an ein anderes Template übergeben?

    Kann man schon, übergeben auch, aber nicht mit XSLT 1.0.
    Aber das habe ich schon bei der letzen Frage zu diesem Problem gesagt.

    Hier wird der Inhatl von dem Knoten kopiert. Das funktioniert:
    <xsl:template match="KapitelRef">
    <xsl:copy-of select="." />
    </xsl:template>

    Ja, das funktioniert: wie gesagt, du kopierst hiermit das Element <KapitelRef> und deren Unterknoten im dem Ergebnissbaum (in die Ausgabe) als literale Ergebniselemente.

    Wenn ich aber um copy-of ein call-template und darum dann ein with-param schachtele , dann funktioniert es nicht mehr:

    Nein, es funktioniert nicht, weil es in XSLT 1.0 nicht möglich ist, temporäre Teilbäume zu benützen.

    <xsl:template match="KapitelRef">
    <xsl:call-template name="KnotenKaRefKopie">
    <xsl:with-param name="pKnotenKaRefKopie" >
    <xsl:copy-of select="."/>
    </xsl:with-param>
    </xsl:call-template>

    Ich würde gern in copy-of den Inhalt von einem Knoten speichern, um den Inhalt dann in einem anderen Knoten / anderes Template weiterzubearbeiten.

    Wenn ich mich recht erinnere, du verwendest bereits Erweiterungen (extensions) z.B. für die ausgabe von mehreren Ergebnisdokumenten. Dann kannst du auf die node-set() Funktion von exslt zurückgreifen:
    http://exslt.org/exsl/functions/node-set/index.html

    Mit Variablen habe ich es auch schon probiert.
    Mit globalen Variablen kann ich den Knoten nicht selektieren und mit der lokalen Variable kann ich den Inhalt nicht in einem anderen Template abrufen.

    Die andere Möglichkeit:
    <xsl:template match="KapitelRef">
     <xsl:apply-templates select="." mode="dingsda" />
    ...
    ...
    <xsl:template match="KapitelRef" mode="dingsda">
     <!-- dieverse Anweisungen -->
    ----------------------

    oder:

    <xsl:template match="KapitelRef">
     <xsl:call-template name="KnotenKaRefKopie">
      <xsl:with-param name="pKnotenKaRefKopie" select=".//p">
    ...
    ...
    <xsl:template name="KnotenKaRefKopie">
     <xsl:param name="pKnotenKaRefKopie" />
      <xsl:for-each select="$pKnotenKaRefKopie">
       <!-- diverse Anweisungen -->
    ------------------------

    Grüße
    Thomas

    1. Hey, Thomas,
      vielen Dank für Deine Hilfe.
      Ich probiere es erstmal mit deinen Ratschlägen.:o)

      Viele Grüße
      verenice

    2. Hallo Thomas,

      <xsl:template match="KapitelRef">
      <xsl:call-template name="KnotenKaRefKopie">
        <xsl:with-param name="pKnotenKaRefKopie" select=".//p">
      ...
      ...
      <xsl:template name="KnotenKaRefKopie">
      <xsl:param name="pKnotenKaRefKopie" />
        <xsl:for-each select="$pKnotenKaRefKopie">
         <!-- diverse Anweisungen -->

      Mh, ich habe das jetzt genau so umgesetzt, aber es funktioniert leider nicht. Woran könnte das liegen?
      Ich lasse mir den Paramter vor der for-each-Schleife testweise mit value-of ausgeben und es wird nichts ausgegeben. Und es steht auch nichts im HTML-Quellcode nach der Transformation. :-/

      Quellcode:
      <xsl:template match="KapitelRef">
      <xsl:call-template name="KnotenKaRefKopie">
      <xsl:with-param name="pKnotenKaRefKopie" select="." />
      <!--</xsl:with-param>-->
      </xsl:call-template>
      </xsl:template>

      <xsl:template name="KnotenKaRefKopie">
      <xsl:param name="pKnotenKaRefKopie" />
      <xsl:value-of select="$pKnotenKaRefKopie" />
      <xsl:for-each select="$pKnotenKaRefKopie">
      <xsl:value-of select="." />
      </xsl:for-each>
      </xsl:template>

      »»<xsl:with-param name="pKnotenKaRefKopie" select=".//p">
      Wofür steht denn hier das p?

      Vielen Dank noch mal.

      Viele Grüße
      verenice

      1. Hallo,

        Mh, ich habe das jetzt genau so umgesetzt, aber es funktioniert leider nicht. Woran könnte das liegen?
        Ich lasse mir den Paramter vor der for-each-Schleife testweise mit value-of ausgeben und es wird nichts ausgegeben. Und es steht auch nichts im HTML-Quellcode nach der Transformation. :-/

        Wenn ich dein XML-Code: http://forum.de.selfhtml.org/archiv/2006/2/t122765/#m789794 richtig im Kopf habe, hat das KapitelRef-Element keinen Textinhalt, also kann auch nichts an der Stelle ausgegeben werden.

        Quellcode:
        <xsl:template match="KapitelRef">
        <xsl:call-template name="KnotenKaRefKopie">
        <xsl:with-param name="pKnotenKaRefKopie" select="." />
        <!--</xsl:with-param>-->
        </xsl:call-template>
        </xsl:template>

        <xsl:template name="KnotenKaRefKopie">
        <xsl:param name="pKnotenKaRefKopie" />
        <xsl:value-of select="$pKnotenKaRefKopie" />

        Gibt eben nichts aus, weil das Element keinen Text enthält. Ein
        <xsl:value-of select="name($pKnotenKaRefKopie)" /> sollte ein "KapitelRef" zurückgeben.

        <xsl:for-each select="$pKnotenKaRefKopie">
        <xsl:value-of select="." />
        </xsl:for-each>

        Gibt eben nichts aus, weil das Element (das ist das aktuelle <KapitelRef> keinen Text enthält. Es wird quasi so gemacht:

        template match:    <KapitelRef>
        tue hier für alle     aktuelle-KapitelRef  etwas.

        Hier greift for-each in diesem Fall auch nur genau ein einziges mal, nämlich immer bei dem KapitelRef-Element für das das Template instanziiert wird, denn es gibt immer nur ein aktuelles Element (hier ist also context-node (das Element in dem du dich befindest) = current-node (das Element, das gerade abgearbeitet wird))

        das Obige zu erweitern:
        template match     <KapitelRef>
          ein <KapitelRef>-Element (mit ID 1) gefunden:
                 instanziere Template für <KapitelRef id="1">
                       tue hier für alle    aktuelle-<KapitelRef id="1">  etwas (gibts ja aber nur einmal)

        »»<xsl:with-param name="pKnotenKaRefKopie" select=".//p">
        Wofür steht denn hier das p?

        Keine Ahnung ;-) Ich dachte das "p" soll auf ein <p>-Element hindeuten.

        Was möchtest du eigentlich ausgeben?

        Grüße
        Thomas

        1. Hallo Thomas,
          vielen Dank für Deine Erklärungen!:o)

          Was möchtest du eigentlich ausgeben?

          Ich möchte gern das Attribut id von KapitelRef ausgeben (von dem kopierten Knoten).

          Viele Grüße
          verenice

          1. Hallo Thomas,
            ich wollte nur mitteilen, dass ich jetzt die ID von KapitelRef rausbekommen habe.*freu*
            Mit
            <xsl:value-of select="@id/." />
            hat es funktioniert.

            Vielen Dank noch mal für Deine Hilfe!

            Viele Grüße
            verenice

            1. Hallo,

              ich wollte nur mitteilen, dass ich jetzt die ID von KapitelRef rausbekommen habe.*freu*

              Schön ;-)

              Mit
              <xsl:value-of select="@id/." />
              hat es funktioniert.

              Schreibe bitte: <xsl:value-of select="@id" />

              Grüße
              Thomas

              1. Hallo Thomas,

                Schreibe bitte: <xsl:value-of select="@id" />

                Ok, mache ich. Vielen Dank!:o)

                Viele Grüße
                verenice