XSL Namespace Attribut verhindert zugriff auf Kind-Elemente – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self XSL Namespace Attribut verhindert zugriff auf Kind-Elemente Fri, 05 Oct 07 13:17:18 Z https://forum.selfhtml.org/self/2007/oct/5/xsl-namespace-attribut-verhindert-zugriff-auf-kind-elemente/1165939#m1165939 https://forum.selfhtml.org/self/2007/oct/5/xsl-namespace-attribut-verhindert-zugriff-auf-kind-elemente/1165939#m1165939 <p>Hallo</p> <p>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.</p> <p>So sieht die Ursprungs XML Datei aus der Finanzsoftware aus:</p> <p><?xml version='1.0' encoding='utf-8'?><br> <soapenv:Envelope xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"<br>     xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><br>     <a href="soapenv:Header" rel="nofollow noopener noreferrer">soapenv:Header</a>[div. irrelevant]</soapenv:Header><br>     <a href="soapenv:Body" rel="nofollow noopener noreferrer">soapenv:Body</a><br>         <IsFinishedResponse xmlns="http://www.abacus.ch/abaconnect/2007.10/adre/HierarchyAddress"<br>            xmlns:act="http://www.abacus.ch/abaconnect/2007.10/core/AbaConnectTypes"<br>            xmlns:apt="http://www.abacus.ch/abaconnect/2007.10/adre/HierarchyAddressTypes"></p> <p><DataContainer><br>              <Data><br>                <a href="apt:AddressData" rel="nofollow noopener noreferrer">apt:AddressData</a><br>                    <a href="apt:IsWorX" rel="nofollow noopener noreferrer">apt:IsWorX</a>false</apt:IsWorX><br>                    <a href="apt:City" rel="nofollow noopener noreferrer">apt:City</a>Gossau SG</apt:City><br>      [usw...]<br>         </apt:AddressData><br>        </Data><br>      </DataContainer></p> <p></IsFinishedResponse><br>       </soapenv:Body><br>    </soapenv:Envelope</p> <p>MIt diesem simplen XSL lässt sich das Problem bereits nachvollziehen:</p> <p><xsl:output indent="yes"/><br>  <xsl:output method="xml"/></p> <p><xsl:template match="/"><br>   <xsl:for-each select="soapenv:Envelope/soapenv:Body/IsFinishedResponse/*"><br>    <xsl:element name="{name()}"/><br>   </xsl:for-each><br>   </xsl:template></p> <p>-> Dieses XSL gibt nichts mehr aus, obwohl es nach meinem verständnis "<DataContainer/>" ausgeben sollte.</p> <p>ab dem Node "<IsFinishedResponse" ist nichts mehr ansprechbar, keine Werte, keine Nodes, ich kann ab dieser Node nichts mehr auslesen.</p> <p>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.</p> <p>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)</p> <p>Als Parser verwende ich ein aktuelles Saxon.</p> <p>gruss</p> <p>lightfly</p> XSL Namespace Attribut verhindert zugriff auf Kind-Elemente Fri, 05 Oct 07 14:19:15 Z https://forum.selfhtml.org/self/2007/oct/5/xsl-namespace-attribut-verhindert-zugriff-auf-kind-elemente/1165940#m1165940 https://forum.selfhtml.org/self/2007/oct/5/xsl-namespace-attribut-verhindert-zugriff-auf-kind-elemente/1165940#m1165940 <p>Hallo</p> <pre><code class="block language-xml">»» <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">xsl:</span>template</span> <span class="token attr-name">match</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> > <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">xsl:</span>for-each</span> <span class="token attr-name">select</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>soapenv:Envelope/soapenv:Body/IsFinishedResponse/*<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> Probiere hier <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">xsl:</span>for-each</span> <span class="token attr-name">select</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>//xyz:IsFinishedResponse/*<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> > <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">xsl:</span>element</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{name()}<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span> > <span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">xsl:</span>for-each</span><span class="token punctuation">></span></span> > <span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">xsl:</span>template</span><span class="token punctuation">></span></span> </code></pre> <p>wobei xyz ein Dummy-Prefix ist, welches beim xsl:stylesheet-Element mit dem Default-NS des Elements IsFinishedResponse anzugeben ist:<br> <code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">xsl:</span>stylesheet</span> <span class="token attr-name">...</span> <span class="token attr-name"><span class="token namespace">xmlns:</span>xyz</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://www.abacus.ch/abaconnect/2007.10/adre/HierarchyAddress<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></code></p> <p>Grüße,<br> Thomas</p> XSL Namespace Attribut verhindert zugriff auf Kind-Elemente Fri, 05 Oct 07 14:42:07 Z https://forum.selfhtml.org/self/2007/oct/5/xsl-namespace-attribut-verhindert-zugriff-auf-kind-elemente/1165941#m1165941 https://forum.selfhtml.org/self/2007/oct/5/xsl-namespace-attribut-verhindert-zugriff-auf-kind-elemente/1165941#m1165941 <p>HI</p> <p>Vielen Dank, das hat funktioniert.</p> <p>Warum ist das so? also die "//" sind mir schon klar, aber wieso kann ich nicht hierarchisch vorgehen?</p> <p>gruss</p> <p>lightfly</p> XSL Namespace Attribut verhindert zugriff auf Kind-Elemente Fri, 05 Oct 07 15:47:26 Z https://forum.selfhtml.org/self/2007/oct/5/xsl-namespace-attribut-verhindert-zugriff-auf-kind-elemente/1165942#m1165942 https://forum.selfhtml.org/self/2007/oct/5/xsl-namespace-attribut-verhindert-zugriff-auf-kind-elemente/1165942#m1165942 <p>Hallo Lightfly,</p> <blockquote> <p>Warum ist das so? also die "//" sind mir schon klar, aber wieso kann ich nicht hierarchisch vorgehen?</p> </blockquote> <p>Das kannst Du durchaus (war nur verkürzt dargestellt):</p> <p><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">xsl:</span>for-each</span> <span class="token attr-name">select</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>soapenv:Envelope/soapenv:Body/xyz:IsFinishedResponse/*<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></code></p> <p>unter Angabe des soapenv-NS und ggf. weiterer beim xsl:stylesheet-Element.</p> <p>Grüße,<br> Thomas</p>