XML, XSL, Xalan - Namensraumproblem?

mcnois

Grünschnabel
Hi Folks,

bin ein absoluter Newbie in der Java-und XML-Programmierung. Jetzt hab ich folgendes Problem:
In einer XML-Datei ist im ersten Element eine Schemadatei als Standard-Namespace angegeben, also nach diesem Schema

<?xml version="1.0"? ... ?>
<ABC xmlns="xxx_abc_1.0.xsd">
usw...


Nun möchte ich bestimmte Knoten mittels eines XSL-Scripts von Xalan ausgeben lassen (die Form spielt in diesem Fall keine Rolle). Das funktioniert nicht, wenn im Element ABC der Standard-Namensraum angegeben ist. Lasse ich den Eintrag weg, bekomme ich das, was ich möchte.
Im XSL-Script habe ich den typischen xmlns:xsl-Eintrag drin.
Was muß ich tun, damit Xalan mir die gewünschten Ausgaben liefert ? Entweder liefert er alles oder gar nichts oder nicht nachvollziehbares Zeug.
Ich habe evtl. den Verdacht, daß Xalan die Namensräume nicht richtig auflösen kann. Wenn dem so ist, hat jemand eine Idee, wie ich den Prozessor dazu bewege, alle Namensräume zu respektieren?
Der Aufruf des Prozessors geschieht über die Kommandozeile wie folgt:

java -cp c:\xalan\xalan.jar;c:\xalan\xercesimpl.jar org.apache.xalan.xslt.Process -IN c:/xtmp/test.xml -XSL c:/xtmp/test.xsl -OUT c:/xtmp/test.txt

Wäre wirklich sehr nett, wenn jemand eine Idee dazu hätte...

Gruß mcnois
 

deepthroat

Erfahrenes Mitglied
Hi.

Falls du XSL Version 2.0 verwendest könntest du das Attribut xpath-default-namespace bei xsl:apply-templates angeben.

Anderenfalls mußt du einfach den Namensraum spezifizieren:
XML:
<xsl:template xmlns:z="xxx_abc_1.0.xsd" match="z:Knoten" />
Gruß
 
Zuletzt bearbeitet von einem Moderator:

mcnois

Grünschnabel
Hallo deepthroat,

vielen Dank für die schnelle Antwort. Leider hat sie nicht viel gebracht :)
Bei mir wird nur XSL Version 1 unterstützt, so daß ich es mit dem 2. Tip von Dir versucht habe. Aber dann bekomme ich den XSLT-Fehler "xsl:template erfordert einen Namen oder ein Übereinstimmungsattribut." Sicher mag er die Angabe des Namensraumes im <xsl:template... nicht. Ich hab auch nichts zu "xsl:template" gefunden, wo steht, daß man das so machen kann. Ich steh also wieder vor dem selben Problem... :confused:

Ich häng nochmal ein Stück der echten XML-Datei an und mein XSL-Script dazu. Vielleicht erklärt das das Problem ein bißchen deutlicher.

XML-Datei:
Code:
<?xml version="1.0"?>
<OMeS xmlns="pm/cnf_rnc_nsn.5.0.xsd"> // Das ist die Problemstelle.
Ich kann das allerdings auch nicht entfernen oder verändern, die XMLs 
werden von einer Maschine generiert.
  <PMSetup startTime="2008-12-09T04:15:00.000+02:00:00" interval="15">
    <PMMOResult>
      <MO>
        <DN><![CDATA[PLMN-PLMN/RNC-5/WBTS-134/FTM-1/IPNO-1/IEIF-1/PHBPM-1]]></DN>
      </MO>
      <PMTarget  measurementType="FTM_PHB_stats">
        <M5118C0>10</M5118C0>
        <M5118C1>11</M5118C1>
        <M5118C10>12</M5118C10>
        <M5118C11>13</M5118C11>
und so weiter...

Mein XSL-Script:
Code:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
   <xsl:apply-templates />
</xsl:template>

<xsl:template match="PMSetup">
   PMSetup-StartTime: <xsl:value-of select="@startTime" />
   PMSetup-Interval : <xsl:value-of select="@interval" />   
</xsl:template>

</xsl:stylesheet>

Als Ergebnis bekomme ich:
Code:
<?xml version="1.0" encoding="UTF-8"?>
  
    
      
        PLMN-PLMN/RNC-5/WBTS-134/FTM-1/IPNO-1/IEIF-1/PHBPM-1
      
      
        10
        11
        12
        13
        14
        10

Haben möchte ich aber:
Code:
<?xml version="1.0" encoding="UTF-8"?>
  
   PMSetup-StartTime: 2008-12-09T04:15:00.000+02:00:00
   PMSetup-Interval : 15

Vielleicht hast Du ja noch eine andere Idee?

Gruß mcnois
 

deepthroat

Erfahrenes Mitglied
Hi.
vielen Dank für die schnelle Antwort. Leider hat sie nicht viel gebracht :)
Bei mir wird nur XSL Version 1 unterstützt, so daß ich es mit dem 2. Tip von Dir versucht habe. Aber dann bekomme ich den XSLT-Fehler "xsl:template erfordert einen Namen oder ein Übereinstimmungsattribut." Sicher mag er die Angabe des Namensraumes im <xsl:template... nicht.
Nein, du hast nur vergessen ein match bzw. name Attribut für das xsl:template anzugeben.
Ich hab auch nichts zu "xsl:template" gefunden, wo steht, daß man das so machen kann. Ich steh also wieder vor dem selben Problem... :confused:
Man darf bei jedem Element eine Namensraumdeklaration vornehmen. Du kannst die Bindung des Namensraumes natürlich auch global am Wurzelknoten vornehmen wie die für den xsl Präfix auch.

Wenn ich deinen Stylesheet beim xsl:template anpasse:
XML:
<xsl:template xmlns:z="pm/cnf_rnc_nsn.5.0.xsd" match="z:PMSetup">
...
bekomme ich mit xsltproc die Ausgabe:
Code:
<?xml version="1.0"?>


   PMSetup-StartTime: 2008-12-09T04:15:00.000+02:00:00
   PMSetup-Interval : 15
Gruß
 
Zuletzt bearbeitet von einem Moderator:

mcnois

Grünschnabel
Hi deppthroat,

*jubilier, jubilier* Es funktioniert ! Herzlichen Dank für Deine schnelle Hilfe. Manchmal sieht man den Wald vor lauter Bäumen nicht. ^^
Wobei ich trotzdem den Eindruck nicht loswerde, daß das Ganze mit dem XSLT etc. noch nicht so richtig ausgereift erscheint. Ich täusche mich da sicherlich, aber diese ganzen Anweisungen sind nicht unbedinkt intuitiv erfaßbar. Und wenn man es dennoch versucht, bekommt man mit unter scheinbar unlogische Ausgaben. Naja, ich werd mich da schon noch durchwurschteln. Vielen Dank nochmal.

Gruß mcnois
 

deepthroat

Erfahrenes Mitglied
Wobei ich trotzdem den Eindruck nicht loswerde, daß das Ganze mit dem XSLT etc. noch nicht so richtig ausgereift erscheint. Ich täusche mich da sicherlich, aber diese ganzen Anweisungen sind nicht unbedinkt intuitiv erfaßbar. Und wenn man es dennoch versucht, bekommt man mit unter scheinbar unlogische Ausgaben.
Die Ausgabe ist eigentlich ganz logisch, da keins deiner Templates zugetroffen hat und Text-Knoten standardmäßig immer ausgegeben werden. Deshalb hast du den ganzen Text der irgendwo innerhalb von Element-Knoten stand ausgegeben bekommen.

Gruß