Lightfly: XSL Namespace Attribut verhindert zugriff auf Kind-Elemente

Hallo

Ich versuche Adressen aus einer Finanzsoftware in den Exchangeserver zu speichern. Die Finanzsoftware bietet mir eine XML Schnittstelle, der Exchange ebenso. Nun versuche ich mittels XSL diese XML Daten in XML WebDav Requests zu Transformieren, scheitere dabei aber an einem Namespace Problem.

So sieht die Ursprungs XML Datei aus der Finanzsoftware aus:

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    soapenv:Header[div. irrelevant]</soapenv:Header>
    soapenv:Body
        <IsFinishedResponse xmlns="http://www.abacus.ch/abaconnect/2007.10/adre/HierarchyAddress"
           xmlns:act="http://www.abacus.ch/abaconnect/2007.10/core/AbaConnectTypes"
           xmlns:apt="http://www.abacus.ch/abaconnect/2007.10/adre/HierarchyAddressTypes">

<DataContainer>
             <Data>
               apt:AddressData
                   apt:IsWorXfalse</apt:IsWorX>
                   apt:CityGossau SG</apt:City>
     [usw...]
        </apt:AddressData>
       </Data>
     </DataContainer>

</IsFinishedResponse>
      </soapenv:Body>
   </soapenv:Envelope

MIt diesem simplen XSL lässt sich das Problem bereits nachvollziehen:

<xsl:output indent="yes"/>
 <xsl:output method="xml"/>

<xsl:template match="/">
  <xsl:for-each select="soapenv:Envelope/soapenv:Body/IsFinishedResponse/*">
   <xsl:element name="{name()}"/>
  </xsl:for-each>
  </xsl:template>

-> Dieses XSL gibt nichts mehr aus, obwohl es nach meinem verständnis "<DataContainer/>" ausgeben sollte.

ab dem Node "<IsFinishedResponse" ist nichts mehr ansprechbar, keine Werte, keine Nodes, ich kann ab dieser Node nichts mehr auslesen.

Sobald ich aber das "xmlns" attribut aus dem <IsFinishedResponse> lösche, funktioniert alles wieder. Sprich, die Ausgabe ist wie gewünscht "<DataContainer/>", ich kann dann wieder auf alles unterhalb zugreifen.

Wenn irgendwie möglich, möchte ich aber Quell XML aus der Finanzapplikation unberührt durch den Parser laufen lassen, d.h. ich möchte nicht vorher jede xml datei öffnen und dieses "xmlns" attribut entfernen, bevor es geparst wird. (fals möglich)

Als Parser verwende ich ein aktuelles Saxon.

gruss

lightfly

  1. Hallo

    »»  <xsl:template match="/">  
    
    >   <xsl:for-each select="soapenv:Envelope/soapenv:Body/IsFinishedResponse/*">  
      
    Probiere hier  
         <xsl:for-each select="//xyz:IsFinishedResponse/*">  
      
    
    >    <xsl:element name="{name()}"/>  
    >   </xsl:for-each>  
    >   </xsl:template>
    
    

    wobei xyz ein Dummy-Prefix ist, welches beim xsl:stylesheet-Element mit dem Default-NS des Elements IsFinishedResponse anzugeben ist:
    <xsl:stylesheet ... xmlns:xyz="http://www.abacus.ch/abaconnect/2007.10/adre/HierarchyAddress">

    Grüße,
    Thomas

    1. HI

      Vielen Dank, das hat funktioniert.

      Warum ist das so? also die "//" sind mir schon klar, aber wieso kann ich nicht hierarchisch vorgehen?

      gruss

      lightfly

      1. Hallo Lightfly,

        Warum ist das so? also die "//" sind mir schon klar, aber wieso kann ich nicht hierarchisch vorgehen?

        Das kannst Du durchaus (war nur verkürzt dargestellt):

        <xsl:for-each select="soapenv:Envelope/soapenv:Body/xyz:IsFinishedResponse/*">

        unter Angabe des soapenv-NS und ggf. weiterer beim xsl:stylesheet-Element.

        Grüße,
        Thomas