Announcement

Collapse
No announcement yet.

xslt und namespaces

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

  • xslt und namespaces

    Hallo zusammen,

    ich hab jetzt schon sooo viele Foren-Posts, Tutorials und Bücher durchforstet aber ich krieg es einfach nicht hin,
    falls mir hier einer einen Tipp geben kann wäre ich sooo dankbar.

    Von einem Lieferanten bekommen ich XML-Datein im folgenden Stil:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <ORDERRESPONSE xmlns="http://www.opentrans.org/XMLSchema/2.1" xmlns:bmecat="http://www.bmecat.org/bmecat/2005" version="2.1">
        <ORDERRESPONSE_HEADER>
            <ORDERRESPONSE_INFO>
                <ORDER_ID>2228122.0</ORDER_ID>
            </ORDERRESPONSE_INFO>
        </ORDERRESPONSE_HEADER>        
    </ORDERRESPONSE>
    Ich möchte nun auf den Wert ORDER_ID via XSL zugreifen,
    aber egal was ich mache ich bekomme den Wert nicht.
    Erst wenn ich den Namespace xmlns="http://www.opentrans.org/XMLSchema/2.1" aus dem XML entferne
    funktioniert es.
    Aber leider übermittelt der Lieferant diesen Namespace und das lässt sich auch nicht ändern.
    Plan B wäre den Namespace im Vorfeld selbst zu entfernen, aber das kann doch nicht die Lösung sein?

    Hier die dazugehörige XSL (hab schon alle möglichen namespace Kombinationen getestet):

    Code:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://www.opentrans.org/XMLSchema/2.1"
    xpath-default-namespace="http://www.opentrans.org/XMLSchema/2.1"
    version="1.0" >
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
    <ORDERID><xsl:value-of select="/ORDERRESPONSE/ORDERRESPONSE_HEADER/ORDERRESPONSE_INFO/ORDER_ID" /></ORDERID>
    </xsl:template>
    </xsl:stylesheet>
    Das Ergebnis:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <ORDERID xmlns="http://www.opentrans.org/XMLSchema/2.1"/>

    Ich hoffe jemand kann mir hier helfen

    Besten Dank schonmal






  • #2
    Die Variante mit
    Code:
    xpath-default-namespace="http://www.opentrans.org/XMLSchema/2.1"
    sollte funktionieren, aber nur mit einem XSLT 2 oder 3 Prozessor, Den gibt es von Saxonica mit Saxon 9 oder 10 inzwischen für die Java-Plattform und für .den Microsoft NET Framework, mit Saxon-C auch für C/C++ und PHP/Python, oder Saxon-JS für Node.js und in Browsern. Ansonsten auch mit XmlPrime oder Altova XML. IBM und Intel sollen auf ihren Server-Plattformen auch eine eigene XSLT 2 Implementierung haben.

    Comment


    • #3
      Danke dir vielmals, hab es gerade mit XSLT 2 getestet, da klappt es !
      Da muss man auch erstmal drauf kommen.

      Comment


      • #4
        Ein XSLT 1 Prozessor sollte bei Verwendung eines nicht definierten Attributs wie xpath-default-namespace (denn dieses existiert in XSLT 1 nicht) eigentlich eine Fehlermeldung wie "Attribute 'xpath-default-namespace' is invalid on 'xsl:stylesheet'" ausgeben. Daher kann ich nicht so ganz verstehen, warum oder mit welcher Software du das Attribut benutzen konntest, ohne das es entweder seine XSLT 2/3 Funktion erfüllte oder aber in XSLT 1 eine klare Fehlermeldung gegeben hätte.

        Comment


        • #5
          Zum test habe ich diesen Online XSL Transformer verwendet.
          https://www.online-toolz.com/tools/x...sformation.php

          Hier wird bei dem Attribut kein Feler geworfen.
          Selbst mit PHP
          $proc = new \XSLTProcessor(); Wird kein Fehler erzeugt wenn ich das Attribut 'xpath-default-namespace' verwende.

          Comment


          • #6
            Beiden liegt libxslt zu Grunde, denke ich, da ist leider die Überprüfung des Stylesheets auf erlaubte Attribute gar nicht oder nur schlecht implementiert.

            Comment


            • #7
              Du schreibst ja ich benötige einen XSLT in der Version > 1. Ich hab heute den ganzen Tag nach ein passenden lib für meinen Ubuntu / Server gesucht aber das einzige was ich finden konnte war
              Saxon-C auch für C/C++ und PHP/Python wenn ich das aber richtig gelesen habe muss ich für die Verwendung von Saxon-C einen kostenpflichtigen Lizenzkey erwerben ?


              Comment


              • #8
                Saxon-C HE benötigt keine Lizenz, aber das Kompilieren. So du Node.js und npm hast, versuche vielleicht einfacher npm install saxon-js und npm install xslt3. Oder nimm die Java Version von Saxon, die HE Variante ist auch offen und erfordert keine Bezahlung einer Lizenz.
                Ansonsten kann auch XSLT 1 Elemente in einem Namensraum selektieren, nur nicht per xpath-default-namespace, sondern per Deklaration
                Code:
                 xmlns:ot="http://www.opentrans.org/XMLSchema/2.1"
                im Stylesheet und dann Qualfizierung von
                Code:
                 <xsl:copy-of select="//ot:ORDER_ID"/>

                Comment

                Working...
                X