26Ksimon86: Von XSLT 2.0 zu XSLT 1.0

Hallo,

Ich habe ein Stylesheet was ich in XSLT 2.0 geschrieben habe. Nun muss das Stylesheet aber in XSLT 1.0 geschrieben werden weil es keinen Transformator existiert der in C++ geschrieben ist XSLT 2.0 unterstüzt.

Meine Frage ist nun was die Änderungen von 1.0 zu 2.0 sind und was ich beachten muss wenn ich mein Stylesheet von 2.0 zu 1.0 übersetzten will.
Oder gibt es doch einen XSLT-Processor in C++ der XSLT 2.0 unterstüzt?

Danke
Simon

  1. Hallo Simon,

    Meine Frage ist nun was die Änderungen von 1.0 zu 2.0 sind und was ich beachten muss wenn ich mein Stylesheet von 2.0 zu 1.0 übersetzten will.

    XSLT 1.0 kann *SEHR VIEL* weniger als XSLT 2.0. Darunter fallen:

    - XPath 1.0 und kein XPath 2.0 - da sind etliche Features nicht dabei.
     - XSLT/XPath 1.0 kann keine Sequenzen (xsl:sequence in XSLT, (1, 2, 3) in
       XPath)
     - Keine eigenen XPath-Funktionen (xsl:function)
     - Keine XPath-Ausdrücke auf temporären XML-Bäume anwendbar
       (<xsl:variable name="foo"><bar x="y" /></xsl:variable> und dann
       <xsl:value-of select="$foo/bar/@x" /> - geht in 2.0, nicht in 1.0)
     - Keine multiplen Output-Dateien etc. (d.h. kein xsl:result-document)
     - Fallback-Verhalten bei Uninterpretierten Extension-Anweisungen ist
       anders
     - Keine Tunnel-Parameter (<xsl:param/with-param tunnel="yes">)
     - bestimmt noch sehr viel mehr, was mir gerade nicht einfällt...

    Oder gibt es doch einen XSLT-Processor in C++ der XSLT 2.0 unterstüzt?

    Der einzige mir bekannte Opensource-XSLT-Prozessor, der XSLT 2.0 kann, ist Saxon. Den gibt's für Java und .NET. .NET kann man auch mit C++ nutzen (allerdings halt nicht nativ, sondern immre nur als in CIL übersetzte Programme).

    Ferner hat Trolltech (äh, ja, Nokia inzwischen) angekündigt, dass die zukünftigte Version von Qt (ist in C++ geschrieben, und GPL) XSLT 2.0 unterstützen soll - in 4.5 partiell und in 4.6 dann vollständig. Ich schätze mal, dass Qt 4.6 in ein bis zwei Jahren fertig sein wird, 4.5 in ein paar Monaten, kann mich da aber auch täuschen, ich kenne die genaue Roadmap nicht. Wollte nur erwähnen, dass das am Horizont ist.

    Viele Grüße,
    Christian

    1. Hallo nochmal,

      Oder gibt es doch einen XSLT-Processor in C++ der XSLT 2.0 unterstüzt?

      [...]

      Was ich ganz vergaß: Es gibt ein paar kommerzielle XSLT-Prozessoren, die man in C++ nutzen kann und die 2.0 können - kosten dann aber auch Geld.

      Viele Grüße,
      Christian

      1. Hallo Christan,
        Viele Dank für deine Antwort
        Habe dann mal mein Stylesheet umgestellt und hänge nun am folgenden Problem.

        <xsl:template name="failsonpagesInfo">
           <xsl:variable name="onPageInfo" select="//pi4:hits[@severity='Info']/pi4:hit/@page"/>
          <xsl:variable name="HitsRuleInfo" select="//pi4:hits/@rule_id"/>
           <xsl:if test="//pi4:hits[@severity='Info']">
            <xsl:for-each select="//pi4:pages/pi4:page[@id=$onPageInfo]">
             <p><b>Hits on Page <xsl:value-of select="@nr"/>:</b>
        <xsl:for-each select="//pi4:rules/pi4:rule[@id=$HitsRuleInfo]/pi4:display_name"><br><xsl:value-of select="."/></br></xsl:for-each></p>
            </xsl:for-each>
           </xsl:if>
         </xsl:template>

        Funktioniert mit XSLT 2.0 mit XSLT 1.0 nicht ... liegt es an den Xpath Ausdrücken ?!

        Simon

        1. Hallo,

          Funktioniert mit XSLT 2.0 mit XSLT 1.0 nicht ... liegt es an den Xpath Ausdrücken ?!

          Eher an den Namensraumangaben. Du musst dir das insbesondere mit dem default NR in XSLT 1.0 ansehen.

          Grüße
          Thomas

          PS: Altova XML hat COM, Java und .NET interface und man kann ihn frei verwenden.
          http://www.altova.com/altovaxml.html

          1. Hi Thomas,

            PS: Altova XML hat COM, Java und .NET interface und man kann ihn frei verwenden.
            http://www.altova.com/altovaxml.html

            Cool, wußte ich auch nicht. Danke für den Hinweis!

            Viele Grüße,
            Christian

        2. Hallo!

          Habe dann mal mein Stylesheet umgestellt und hänge nun am folgenden Problem.

          <xsl:template name="failsonpagesInfo">
             <xsl:variable name="onPageInfo" select="//pi4:hits[@severity='Info']/pi4:hit/@page"/>
            <xsl:variable name="HitsRuleInfo" select="//pi4:hits/@rule_id"/>
             <xsl:if test="//pi4:hits[@severity='Info']">
              <xsl:for-each select="//pi4:pages/pi4:page[@id=$onPageInfo]">
               <p><b>Hits on Page <xsl:value-of select="@nr"/>:</b>
          <xsl:for-each select="//pi4:rules/pi4:rule[@id=$HitsRuleInfo]/pi4:display_name"><br><xsl:value-of select="."/></br></xsl:for-each></p>
              </xsl:for-each>
             </xsl:if>
          </xsl:template>

          Funktioniert mit XSLT 2.0 mit XSLT 1.0 nicht ... liegt es an den Xpath Ausdrücken ?!

          Was ist denn die genaue Fehlermeldung, die Dein XSLT 1.0 Prozessor ausspuckt? Und: Welchen verwendest Du?

          Viele Grüße,
          Christian