namespace Deklaration mit XSL
DCast
- xsl
0 Thomas J.S.0 Dcast
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. die prefixe und die URI liegen dabei in einer anderen XML die ich eben mit XSL auswerte
also mir liegt etwa in der XML vor:
<namespace>
<prefix>xmlns</prefix>
<URI>http:www.xxx.com</URI>
</namespace>
<namespace>
<prefix>xmlns:no3</prefix>
<URI>http:www.x03.com</URI>
</namespace>
<namespace>
<prefix>xmlns:ns2</prefix>
<URI>http:www.xx2.com</URI>
</namespace>
<namespace>
<prefix>xmlns:ff</prefix>
<URI>http:www.ff.com</URI>
</namespace>
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 und ich die XSL nicht permanent anpassen möchte. Jetzt wollte ich versuchen in einer for-each namepsace Anweisung
<xsl:element name="Root">
<xsl:attribute name="{prefix}" namespace="{URI}">
<xsl:value-of select="URI">
</xsl:attribute>
</element>
Aber solange ich die Namespaces ja nicht im XSL deklariere, gibt er mir natuerlich nicht mehr die prefix sauber wieder. Gibt es einen Weg hierfür?
Zur Zeit schreibe ich nun mein root element mit attributen über <xsl:text disable-output-escaping="yes"> methode. allerdings finde ich dies nicht gerade sehr elegant. Kennt jemand eine Lösung?
Gruß
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
Hallo Thomas,
vielen Dank für die ausführliche Antwort. Leider kann ich keinen xslt 2.0 fähigen parser benutzen. Mal schauen, ob ich vielleicht doch irgendiwe saxon8b einbinden kann.
Hallo,
vielen Dank für die ausführliche Antwort. Leider kann ich keinen xslt 2.0 fähigen parser benutzen. Mal schauen, ob ich vielleicht doch irgendiwe saxon8b einbinden kann.
Saxon 8B gibts ja auch schon in einer .NET Version oder du kannst das "AltovaXML" verwenden, ebnfalls XSLT 2.0 fähig und darft kostenlos verwendet werden. http://www.altova.com/altovaxml.html
Grüße
Thomas