56760
Goto Top

XSLT-Problem mit xlmns-Namespaces im XML-Source-File

Nur ohne die Namespaces im ersten Tag, läuft die XSLT-Transformation wie erwartet.

Hallo,

weil msxslt keine xlmns-Namespaces im XML verarbeiten kann, bin ich auf Saxon umgestiegen.
Sowohl mit XSLT 1.0 noch XSLT 2.0 habe ich dort das folgende Problem:

Meine XML-Datei, die transformiert werden soll:


<?xml version="1.0" encoding="UTF-8"?>
<!-- Damit geht's -->

<taskmanager version="1.0" >

<!-- Damit nicht!
<taskmanager version="1.0" xmlns="NAMESPACE1"
xmlns:bis="NAMESPACE2"
xmlns:ddt="NAMESPACE3"
xmlns:cml="NAMESPACE4"
xmlns:log="NAMESPACE5"
....
>
-->

<tasks>
<import assembly="Test.dll" />
</tasks>


<!-- Irgendein Kommentar -->
<procedure>Test</procedure>


</taskmanager>

Mein xslt-Stylesheet sieht wie folgt aus:
<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" encoding="utf-8" indent="yes" />

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

<xsl:template match="taskmanager">
<Taskmanager>
<xsl:apply-templates select="tasks"/>
<xsl:apply-templates select="procedure"/>
</Taskmanager>
</xsl:template>

<xsl:template match="tasks">
<Tasks>
</Tasks>
</xsl:template>

<xsl:template match="procedure">
<test>
<xsl:text>Test</xsl:text>
</test>
</xsl:template>
</xsl:stylesheet>

Nur, wenn ich die xlmns auskommentiere, dann erhalte ich das Ergebnis:

<?xml version="1.0" encoding="utf-8"?>
<Taskmanager>
<Tasks/>
<test>Test</test>
</Taskmanager>

Kommentier ich's wieder ein, dann erhalte ich nur:
<?xml version="1.0" encoding="utf-8"?>

aber keinen Fehler vom XSLT-Prozessor.

Kennt jemand eine Lösung wie es auch mit den xlmns-Namespaces klappt?

Herzlichen Dank im Voraus.

Content-Key: 72558

Url: https://administrator.de/contentid/72558

Ausgedruckt am: 28.03.2024 um 23:03 Uhr

Mitglied: 56760
56760 02.11.2007 um 13:17:01 Uhr
Goto Top
Ich hab inzwischen einen Lösungsansazt durch googeln gefunden.

Die Namespaces müssen auch ins XSLT rein:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns="NAMESPACE1"
xmlns:bis="NAMESPACE2"
xmlns:ddt="NAMESPACE3"
xmlns:cml="NAMESPACE4"
xmlns:log="NAMESPACE5"



<xsl:output method="xml" encoding="utf-8" indent="yes" />

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

<xsl:template match="taskmanager">
<Taskmanager>
<xsl:apply-templates select="tasks"/>
<xsl:apply-templates select="procedure"/>
</Taskmanager>
</xsl:template>

<xsl:template match="tasks">
<Tasks>
</Tasks>
</xsl:template>

<xsl:template match="procedure">
<test>
<xsl:text>Test</xsl:text>
</test>
</xsl:template>
</xsl:stylesheet>

Aber leider hilft das auch nicht weiter.
Kommentiere ich nach dieser Änderung im XML die xmlns-Anteile wieder ein, dann ist das Ergebnis leider immer noch das alte.
Mitglied: 56760
56760 02.11.2007 um 16:17:29 Uhr
Goto Top
Inzwischen hab ich die Lösung gefunden.

http://www.webmasterworld.com/forum26/227.htm

Es ging nur um den ersten Namespace xlmns="NAMESPACE1"
Dieser muss im Stylesheet (wie im ersten Versuch bereits geschehen) mit einem Prefix (z. B. sio)eingefügt werden.

Anschließend alle Matches und selects um das Prefix "sio:" ergänzen.

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sio="NAMESPACE1">

<xsl:output method="xml" encoding="utf-8" indent="yes" />


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

<xsl:template match="sio:taskmanager">
<Taskmanager>
<xsl:apply-templates select="sio:tasks"/>
<xsl:apply-templates select="sio:procedure"/>
</Taskmanager>
</xsl:template>

<xsl:template match="sio:tasks">
<Tasks>
</Tasks>
</xsl:template>

<xsl:template match="sio:procedure">
<test>
<xsl:text>Test</xsl:text>
</test>
</xsl:template>
</xsl:stylesheet>