Hallo,
ich hoffe hier kann mir geholfen werden, habe mir auch schon die W3C Punkte zu meinem Sachverhalt durchgelesen, aber eine richtige Lösung habe ich noch nicht gefunden. Ich moechte eine XML erstellen und im root element die namespace attribute erstellen.
Geht nicht. Die XSL-Spez. sagt ausdrücklich, dass man xsl:attribut nicht benützen darf um Namensraumdeklarationen zu für ein Attribute mit dem Namen xmlns oder xmlns:* zu erstellen.
Du kannst zwar soetwas machen:
--------
<xsl:element name="Root" namespace="{namespace[1]/URI}">
<xsl:for-each select="namespace[contains(prefix, ':')]">
<xsl:attribute name="{prefix}" namespace="{URI}">
<xsl:value-of select="URI" />
</xsl:attribute>
</xsl:for-each>
</xsl:element>
---------
Das ergebniss wird aber so aussehen:
-------
<Root xmlns="http://www.xxx.com" xmlns:ns0="http://www.x03.com"
xmlns:ns0_2="http://www.xx2.com"
xmlns:ns0_3="http://www.ff.com"
ns0:no3="http://www.x03.com"
ns0_2:ns2="http://www.xx2.com"
ns0_3:ff="http://www.ff.com"/>
--------
Der XSLT-Prozessor muss die Namensräume invertieren und darauch entsteht dann ein ns001 etc.
Für den Default Namensraum an einem Element kannst du jedoch etwas machen:
<xsl:element name="Root" namespace="{namespace[1]/URI}">, dabei kommt dann <Root xmlns="http://www.xxx.com"> aus.
Nun möchte ich gerne eine neue XML erstellen mit XSL. In der XSL kann ich jedoch nicht jeden Namespace vorher deklarieren, da die XML Quelle sich ändert
Das ist eine sehr ausergewöhnliche Anforderung.
Kannst du XSLT 2.0 verwenden, hast du eine einfach möglichkeit:
--------
<xsl:element name="Root" namespace="{namespace[1]/URI}">
<xsl:for-each select="namespace[contains(prefix, ':')]">
<xsl:namespace name="{substring-after(prefix, 'xmlns:')}" select="URI" />
</xsl:for-each>
</xsl:element>
----------
Das Ergebnis ist dann:
<Root xmlns="http://www.xxx.com" xmlns:no3="http://www.x03.com"
xmlns:ns2="http://www.xx2.com"
xmlns:ff="http://www.ff.com"/>
Grüße
Thomas