Theo: Wo liegt der Haken XSLT1.0 zu XSLT2.0

Hallo,

ich wollte auf Grund der Funktionen resolve-uri in Kombination mit base-uri auf xslt 2.0 umsteigen. Allerdings muss ich nun feststellen, dass xslt2.0 nicht so einfach mit meinem bisherigen stylesheet harmoniert. Und zwar habe ich rekursive templates, wobei ich einen knoten positionsweise durchlaufen lasse, bis es keinen mehr gibt, also z.B.

<knoten attribute="wert"/>
<knoten attribute="wert2"/>
.
.
.
<knoten attribute="wertx"/>

der knoten wird dabei als parameter dem template immer zugewiesen durch
<xsl:wit-param name="knoten" select="knoten[position() &gt; 1]"/>

innerhalb des Templates werden einige umwandlung durchgeführt, unter anderem <xsl:value-of select="concat('zusatzwert',$knoten/@attribute)"/>

und es scheint so, als dass da genau nun xslt2.0 meckert in der Art
"A sequence of more than one item is not allowed as the second argument of concat()"

Da seltsame, ich verwende Saxon8B und wenn ich die stylesheets auf xsl 1.0 zuücksetze, funktioniert wieder alles, nur wenn ich die sheets auf 2.0 setze wird gemeckert. Wo liegt mein handwerklicher Fehler? Ich kann aus bestimmten gründen kein xsl:for-each verwenden und bin auf diese rekursive templates angewiesen.

Gruß

  1. Hallo,

    ich wollte auf Grund der Funktionen resolve-uri in Kombination mit base-uri auf xslt 2.0 umsteigen.

    innerhalb des Templates werden einige umwandlung durchgeführt, unter anderem <xsl:value-of select="concat('zusatzwert',$knoten/@attribute)"/>

    und es scheint so, als dass da genau nun xslt2.0 meckert in der Art
    "A sequence of more than one item is not allowed as the second argument of concat()"

    Du kannst statt concat: string-join('zusatzwert', $knoten/@attribute) versuchen.

    Grüße
    Thomas

    1. Hallo Thomas,

      danke fuer die schnelle Antwort,

      also er scheint mit string-join erst einmal weiterzukommen, allerdings kommt er nicht durch ganz durch, so dass ich nicht sehe, ob er es richtig macht. jetzt hängt er (der parser ;-) bei substring-after($knoten/@attribute,'zeichen') mit der gleichen Fehlermeldung. Gibt es eine Erklärung, was nun der Unterschied geworden ist, warum das concat nicht mehr funktioniert. Habe versucht beim w3c nachzulesen, aber das steht soweit ich gefunden habe gerade mal ein 4 Zeiler zu string-join. Das ist ja zum Haare raufen, warum belegen die eine function mit neuem Inhalt und schaffen eine anderen (mein Kopf dampft).

      Gruß

      1. Hallo,

        danke fuer die schnelle Antwort,

        also er scheint mit string-join erst einmal weiterzukommen, allerdings kommt er nicht durch ganz durch, so dass ich nicht sehe, ob er es richtig macht. jetzt hängt er (der parser ;-) bei substring-after($knoten/@attribute,'zeichen') mit der gleichen Fehlermeldung. Gibt es eine Erklärung, was nun der Unterschied geworden ist, warum das concat nicht mehr funktioniert.

        Es liegt eher nicht an concat(), denn da hat sich nichts geändert, sondern am value-of.
        value-of in XSLT 1.0 selektierte das erste Vorkommen in einer Sequenz: d.h. $knoten/@attribute entsprach: 1. gefundene "Knoten" in Dokumentordnung / @attrib.
        In XSLT 2.0 liefert value-of für $knoten/@attribute alle gefundene "Knoten" und damit hat dann concat ein Problem, denn der Argument in concat() muss ein einzelner String sein und nicht eine (Reihen)Folge von Strings.

        Aber mit <xsl:with-param name="knoten" select="knoten[position() &gt; 1]"/> bekommst du eben nicht nur einen Knoten sondern möglicherweise eben sehr viele.
        Du kannst es einfach mal für dich testen, ein: <xsl:value-of select="name($knoten)" separator="-" /> sollte/wird dir mehrere Namen ausgeben.

        Grüße
        Thomas

        1. Hallo Thomas,

          da scheinst du genau das Richitge zu beschreiben, ich habe es jetzt auch gemerkt, nachdem ich das xsl sheet soweit bereinigt hatte (von allen substring, string, substring-after ...) Und er liefert mir jetzt mit string-join, alle Werte in dem Knoten, die noch vorhanden sind - also es liegt wirklich daran, dass nicht der erste findbare wert ausgewählt wird, sonder alle möglichen Werte. Hm, das ist jetzt wirklich sehr ärgerlich, und ich kann jetzt nicht auf die Schnelle alles umschreiben. Gibt es vielleicht eine Möglichkeit, mit einem Xpath Ausdruck bzw.anderen Möglichkeiten hier wieder das "Trefferverhalten" von 1.0 herzustellen, bzw. ich habe nicht gefunden, wie man anweisen kann, nur die ersten Wert zu nehmen. XSLT 2.0 scheint sowieso auch beim Rechnen nicht automatisch einen Wert als Nummer (sofern möglich), zu interpretieren - das stellt jedoch keine Problem dar, da man den Ausdruck schnell in eine number() setzen kann.

          Gruß

          1. Hallo,

            da scheinst du genau das Richitge zu beschreiben, ich habe es jetzt auch gemerkt, nachdem ich das xsl sheet soweit bereinigt hatte (von allen substring, string, substring-after ...) Und er liefert mir jetzt mit string-join, alle Werte in dem Knoten, die noch vorhanden sind - also es liegt wirklich daran, dass nicht der erste findbare wert ausgewählt wird, sonder alle möglichen Werte. Hm, das ist jetzt wirklich sehr ärgerlich, und ich kann jetzt nicht auf die Schnelle alles umschreiben. Gibt es vielleicht eine Möglichkeit, mit einem Xpath Ausdruck bzw.anderen Möglichkeiten hier wieder das "Trefferverhalten" von 1.0 herzustellen, bzw. ich habe nicht gefunden, wie man anweisen kann, nur die ersten Wert zu nehmen.

            Da du eh ein rekursives Template verwendest, kannst ud ja einen Zähler einbauen:
            <xsl:param name="c" select="1" />

            der knoten wird dabei als parameter dem template immer zugewiesen durch
            <xsl:with-param name="knoten" select="knoten[position() = $c]"/>
            <xsl:with-param name="c" select="number($c + 1)"/>

            XSLT 2.0 scheint sowieso auch beim Rechnen nicht automatisch einen Wert als Nummer (sofern möglich), zu interpretieren -

            Ja, die automatische konvertierung von Werten wie im XSLT 1.0 gab, gibt es im XSLT 2.0 nicht mehr.

            Grüße
            Thomas

            1. Hallo Thomas,

              danke für den Hinweis, das wuerde aber sehr viel Arbeit bedeuten ;-( Na ja, ich schlafe noch einmal darüber und entscheide dann. ob ich das parsen in zwei schritten mache oder doch in einem durchgang, dann aber mit xslt2.0.

              Gruß & Dank

              Holger