XML mit standardnamensraum in xslt

Dieses Thema XML mit standardnamensraum in xslt im Forum "Webentwicklung, Hosting & Programmierung" wurde erstellt von magics, 31. Aug. 2005.

Thema: XML mit standardnamensraum in xslt Hallöchen! Ich habe ein etwas komisches Problem. Ich bekomme aus einer BlackBox eine XML Datei mit vereinfacht...

  1. Hallöchen!

    Ich habe ein etwas komisches Problem.
    Ich bekomme aus einer BlackBox eine XML Datei mit vereinfacht gesagt folgendem Aufbau:
    Code:
    <?xml version=1.0 encoding=ISO-8859-1?>
    <root xmlns=[url]http://NAMESPACE>[/url]
     <record>
      <name>NAME1</name>
      <value>VALUE1</value>
     </record>
     <record>
      <name>NAME2</name>
      <value>VALUE2</value>
     </record>
     <record>
       ...
     </record>
    </root>
    
    Das erstellen dieser Datei kann ich nicht beeinflussen, ich kann also kein Namespacemapping einbinden.

    Nun möchte ich diese XML Datei mittels xslt bearbeiten. Meine Versuche auf die Elemente in der XML zu zu greifen scheitern jedoch kläglich, was sich ändert sobald ich den Namensraum per mapping nutze (<ns0:root xmlns:ns0=http://NAMESPACE> ...</ns0:root>)

    Gibt es eine Möglichkeit auf die Elemente Zugriff zu bekommen?
    Mein Bisheriger Ansatz wäre folgender:
    Code:
    <?xml version=1.0 encoding=ISO-8859-1?>
    <xsl:stylesheet version=1.0
    xmlns=[url]http://NAMESPACE[/url]
    xmlns:xsl=[url]http://www.w3.org/1999/XSL/Transform>[/url]
    
    <xsl:template match=/>
       <xsl:for-each select=root/record>
        <xsl:value-of select=name/> = <xsl:value-of select=value/>
       </xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>
    
    funktioniert aber leider nicht.

    Bin für jeden Ansatz dankbar.

    PS: Das Konvertieren der Datei im vorraus möchte ich möglichst vermeiden.
     
  2. Ähm was zum Geier hat diese Angabe in der XML Datei und der XLST Datei zu suchen? http://NAMESPACE

    Und wo bitte weißt du der XML Datei die passende XSLT Datei zu?

    Genau wie bei HTML muss auch in der XML Datei ein Verweis auf die CSS bzw. XLST Datei zu finden sein.

    AFAIK fehlt in der XML Datei eine Angabe wie diese

    Code:
    <?xml-stylesheet type=text/xsl href=gruss.xsl ?>
    
    und in der XSLT Datei sollte der Kopf etwas so aussehen

    Code:
    <?xml version=1.0 encoding=iso-8859-1?>
    <xsl:stylesheet version=1.0 xmlns:xsl=[url]http://www.w3.org/1999/XSL/Transform>[/url]
    
    Die Zuweisung der passenden XSLT Datei im Kopf der XML Datei kannst du dir sparen wenn dies dynamisch über ein Script oder so geschieht.

    Z.B. wenn ein php Script die Übergabe von XML und XLST an den XML Parser übernimmt. Was du vermutlich machen musst, da du sagtest das die Erstellung der XML Datei von dir nicht beeinflusst werden kann. Somit musst du wohl auf ein Script zurück greifen, das die Dateinamen der XML und XSLT Datei an den entsprechend installierten XML Parser des Webservers übergibt. Was anderes würde mir jedenfalls sonst nicht einfallen ohne das die XML Datei nachträglich bearbeitet werden muss.

    P.S. Schau doch mal hier vorbei: http://de.selfhtml.org/xml/index.htm Selfhtml ist immer eine Interessante Lektüre.
     
  3. Das mit dem namensraum
    Code:
    [url]http://NAMESPACE[/url]
    
    sollte nur ein Beispielnamensraum sein, da ich das ganze etwas abstrakt halten möchte.

    Um etwas genauer zu werden: Das ganze hat für mich nicht wirklich etwas mit Webentwicklung zu tun, es passt auf Grund des XML/XSLT jedoch nur hier.
    Ich habe ein Programm, welches XML-Dateien mittels XSLT bearbeiten kann, ich gebe in diesem Programm die XML und die zugehörige XSLT Datei an und erhalte das Ergebnis in einer neuen Datei. Da dieses Programm bei uns in der Firma laufen soll möchte ich sowenig Schritte wie möglich haben (Wartbarkeit, ...) also kommt eine vorangestellte externe Konvertierung der XML nur als letzter Ausweg in Frage.

    Natürlcih habe mich im vorfeld bei selfhtml, w3school und anderen Webseiten schlau gemacht, diese verwenden allerdings immer Präfixe für den Namensraum. Ich muss jedoch die unten gechriebene XML-Datei auswerten, wleche nur einen Standartnamensraum benutzt.

    Ich hoffe, es ist irgendwie möglich dem XSLT-Prozessor verständlich zu machen, dass er die Iteration über diese Elemente beginnen soll.

    Ich hoffe das war jetzt etwas verständlich.
     
  4. Also, wozu brauchst du in deinem Fall Namensräume? Du arbeitest nicht mit einer XLST und zig verschiedenen XML Dateien wo sich die Tag Namen überschneiden, oder?

    Ansonsten verstehe ich nicht wo dein Problem ist. Gib doch einfach in der XML Datei den Pfad der dazugehörigen XLST Datei an und gut ist. Diese Angabe fehlt bei dir VÖLLIG.

    Diesen Teil kannst du weglassen, wenn du dem XML Prozessor den Pfad der XML und der XLST Datei direkt übergibst.

    Das kannst du entweder per Script, per Batch oder weiß der Geier wie machen (meinetwegen auch händisch).

    Was läuft denn deiner Meinung nach falsch. Welches Ergbnis liefert dir der Prozessor aktuell und welches SOLLTE er deiner Meinung nach liefern.

    Sorry, aber entweder steh ich völlig auf dem Schlauch oder ich weiß auch nicht.
     
  5. Um es noch ein 3. ma zu sagen:
    Ich erstelle die XML-Datei nicht! Und wenn ich es könnte würde ich die Namensräume liebend gern rauslassen. Aber wenn ich 50 Tochterfirmen sagen soll, Sie sollen jeder 3 Programme umschreiben (nur weil ich es nicht gebacken kriege ihre XML zu bearbeiten) kann ich mir morgen einen neuen Job suchen.

    Ich übergebe dem XSLT-Prozessor schon beide Dateien (brauch und kann es in der xml also nicht machen)
    Die ausgabe ist eine leere Datei, da der XSLT Prozessor die Elemente der XML (auf Grund des Standardnamensraumes) nicht findet. Herauskommen sollte eine neue Datei (in dem unten gezeigten Beispiel keien XML, in wirklcihkeit schreib cih das dann so um, dass es eine XML ist) welche die gemappten Werte der ausgangsdatei enthält.

    Meine Frage ist doch nur, wie ich in einem XSLT auf Elemente einer XML Datei zugreife, welche einem Standardnamensraum unterliegen.
     
  6. Also, um es auch nochmal zu sagen. Dein Problem hat NICHTS, aber auch absolut NICHTS mit Namenräumen zu tun.

    Deine XSLT Datei ist einfach nur murks.

    Probier doch mal diese test.xsl

    Code:
    <?xml version=1.0 encoding=ISO-8859-1?>
    <xsl:stylesheet version=1.0
    xmlns=[url]http://NAMESPACE[/url]
    xmlns:xsl=[url]http://www.w3.org/1999/XSL/Transform>[/url]
    
    <xsl:template match=/>
          
    	
    <html>
    <head>
    <title>Test</title>
    </head>
    <body>
    <xsl:apply-templates />
    
    </body>
    </html>
    </xsl:template>
    
    <xsl:template match=root>
    <xsl:for-each select=record>
    <p><xsl:value-of select=name/> = <xsl:value-of select=value/></p>
    </xsl:for-each>
    </xsl:template>
    
    </xsl:stylesheet>
    
    Wenn du die mit deiner XML Datei verwendest kommt ganz urplötzlich ein Ergebnis heraus!

    Es liegt also nicht an den Namensräumen oder der XML Datei, sondern ausschließlich an deiner XLST Datei. IMHO solltest du dich mit XLST und XPATH noch ein wenig Intensiver beschäftigen.
     
  7. Also ich bekomme eine Ausgabe, allerdings nicht die von mir erwartete:
    Code:
    <?xml version=1.0 encoding=UTF-8?>
    
    <html xmlns=[url]http://NAMESPACE>[/url]
      <head>
        <title>Test</title>
      </head>
      <body>
      
        NAME1
        VALUE1
      
      
        NAME2
        VALUE2
      
    </body>
    </html>
    
    Werde das Beispiel nachher mal zu Hause mit einem anderen XSLT-Prozessor ausprobieren.

    Auf jedenfals Danke für deine Mühe (Und Geduld)
     
  8. Ich würde mal behaupten das liegt daran das ich an der XSLT nix groß verändert habe. Ich habe nur mit der Umstrukturierung zeigen wollen das du eine Ausgabe (egal welche) hin bekommen kannst. Wollte dir einfach zeigen das es nicht an der XML lag und nicht an den Namensräumen (weiß immer noch nicht wie du da drauf kommst) sondern das es ausschließlich an der von dir Formulierten XSLT lag.

    Ähm wieso suchst du denn schon wieder an einer anderen Ecke? Was hat das denn mit dem XSLT Prozessor zu tun? Das da ggf. nicht die Ausgabe raus kommt die DU dir erhofft hast ist vollkommen richtig.

    Ich habe ausschließlich deine XSLT so angepasst das eine Ausgabe zu sehen ist. Nicht mehr und nicht weniger. Im übrigen habe ich das ausschließlich mit dem Internet Explorer getestet. (Der kann XML und XLST miteinander verknüppeln!)
     
  9. Also das von dir angepasste XSLT funktioniert auch nicht, wenn ich das XSLT richtiug verstehe (und ich glaube mal, das ich das richtig verstehe) sollte etwa folgende XML-Datei erzeugt werden:
    Code:
    <?xml version=1.0 encoding=UTF-8?>
    
    <html xmlns=[url]http://NAMESPACE>[/url]
     <head>
      <title>Test</title>
     </head>
     <body>
     <p>NAME1 = VALUE1</p>
     <p>NAME1 = VALUE1</p>
    </body>
    </html>
    
    Wie ich jedoch in meinem letzten Posting geschrieben habe kommt eine absolut unbearbeitete Ausgabe heraus. Dies geht sogar soweit, dass selbst felder, auf welche ich in der XSLT nicht zugreife übernommen werden. Vom aussehen scheint es als würde er die Tags wegschneiden und den Text einfach stehen lassen (und das ist sicher nicht das zu erziehlende resultat)

    Warum ich so sehr auf den namensraum eingehe?
    Ganz einfach! Wenn ich den namensraum weglasse, bzw. diesen über einen Prefix angebe, funktioniert alles wunderbar.
    BSP:
    Code:
    <?xml version=1.0 encoding=ISO-8859-1?>
    <ns0:root xmlns:ns0=[url]http://NAMESPACE>[/url]
     <record>
      <name>NAME1</name>
      <value>VALUE1</value>
     </record>
     <record>
      <name>NAME2</name>
      <value>VALUE2</value>
     </record>
    </ns0:root>
    
    mit der xslt:
    Code:
    <?xml version=1.0 encoding=ISO-8859-1?>
    <xsl:stylesheet version=1.0
    xmlns:ns0=[url]http://NAMESPACE[/url]
    xmlns:xsl=[url]http://www.w3.org/1999/XSL/Transform>[/url]
    
    <xsl:template match=/>
       <xsl:for-each select=nso:root/record>
        <p><xsl:value-of select=name/> = <xsl:value-of select=value/></p>
       </xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>
    
    produziert folgende ausgabe:
    Code:
    <?xml version=1.0?>
    <root xmlns:ns0=[url]http://NAMESPACE>[/url]
     <p>NAME1 = VALUE1</p>
     <p>NAME2 = VALUE2</p>
    </root>
    
    Ist der Unterschied erkennbar?
    Ich kann auhc mal so fragen, wie kann ich mit xslt aus der in meinem ersten Posting geposteten XML eine XML mit folgendem aufbau machen:
    Code:
    <?xml version=1.0?>
    <root>
     <p>NAME1 = VALUE1</p>
     <p>NAME2 = VALUE2</p>
    </root>
    
    Und zur info: Ich nutze zum testen ers xslt xsltproc unter Linux. Auf Arbeit ist es ein SAP interner XSLT-Processor.
     
Die Seite wird geladen...

XML mit standardnamensraum in xslt - Ähnliche Themen

Forum Datum
XSLT leeres element tag löschen Windows XP Forum 20. Apr. 2006
Mit XSLT auf ein Attribut eines XML-Tags zugreifen Windows XP Forum 31. März 2004