Announcement

Collapse
No announcement yet.

XSD mit XSLT transformieren oder: Wie komme ich an xmlns-Attribute ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • XSD mit XSLT transformieren oder: Wie komme ich an xmlns-Attribute ?

    Hallo zusammen,

    folgendes Problem:
    Ich möchte mittels eines XSLT Stylesheets ein XML Schema (XSD) in ein weiteres XML-Dokument transformieren. Nun ist es ja möglich, in einem XSD Elemente zu definieren, die über das type-Attribut andere (Root-) Elemente im Schema referenzieren.

    Beispiel:
    Code:
    <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:TST="http://eineuri" targetNamespace="http://eineuri" elementFormDefault="qualified" attributeFormDefault="qualified">
    <element name="First">
      <complexType>
        <sequence>
          <element name="Second" type="TST:SecondType"/>
        </sequence>
      </complexType>
    </element>
    <simpleType name="SecondType">
      <restriction base="string">
        <maxLength value="10"/>
      </restriction>
    </simpleType>
    </schema>
    Mein Problem ist nun, dass ich für ein type-Attribut ein Template aufrufen will, welches den referenzierten Typen transformiert. Da aber einmal ein Prefix verwendet wird und einmal nicht (was ja ok ist, da Prefix und targetNamespace identisch sind), schlägt ein Vergleich von type-Attribut und simpleType-Name natürlich fehl.

    Also hab ich mir gedacht, ich schalte ein weiteres XSLT davor, welches mir alle prefixlosen name-Attribute mit dem entsprechenden Prefix (so es eines gibt, das auf den targetNamespace passt) ausstattet.

    Nun stehe ich aber vor dem Problem, dass sich die xmlns-Attribute im schema-Tag des XSD nicht adressieren lassen:
    Code:
    <xsl:stylesheet version="1.0"
    	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    	xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    
    
      <xsl:template match="/xsd:schema">
    	<xsl:for-each select="@*">
    		<xsl:value-of select="name()"/>
    	</xsl:for-each>
      </xsl:template>  
    </xsl:stylesheet>
    Dies liefert lediglich targetNamespace, elementFormDefault und attributeFormDefault als Attribute zurück, nicht aber die xmlns.

    Ich würde mich sehr freuen, wenn jemand eine Idee oder wenigstens einen Lösungsansatz für das eine oder das andere Problem hätte.

    Danke im voraus.

    Gruß,
    Taurion
    Zuletzt editiert von Taurion; 25.04.2007, 17:29.

  • #2
    Hui, das ist echt ein Problem ... welchen XSLT-Prozessor verwendest Du denn? Vielleicht hilft eine Extension weiter. Oder XSLT 2.0. Hier gibt es Funktionen, um Prefixe und Namespace-URI zu ermitteln:

    http://www.saxonica.com/documentatio...ons/intro.html
    Martin Szugat
    www.aboutxml.de

    Comment


    • #3
      Ich habe bisher den Java-Built-In Processor verwendet, werde mir aber mal die 2.0 Funktionen anschauen und ggf. einen anderen Processor verwenden, wenn's hilft

      Comment


      • #4
        Ich hab jetzt mal den Saxon verwendet und ein wenig mit den 2.0 Funktionen herumgespielt. Das Problem liegt wohl darin, dass die meisten Funtionen ein Typproblem haben, z. B. einen QName erwarten. Der Inhalt des type-Attributs repräsentiert zwar einen QName, ist aber selbst ein xs:string, so dass mich die Funktionen auf den ersten Blick nicht wesentlich weiter bringen...

        Falls Du oder jemand anderes noch eine andere konkrete Idee hat: immer her damit

        Danke im voraus.

        Comment


        • #5
          Nun ja, manchmal sieht man den Wald vor Bäumen nicht.

          An die Namespace-Deklarationen kommt man (natürlich!) über die namespace-Achse im XPath.

          Für mein konkretes Problem hab ich erstmal folgende Lösung:

          Code:
          	<xsl:variable name="targetNamespace" select="xsd:schema/@targetNamespace"/>
          
          	<xsl:variable name="targetPrefix">		
          		<xsl:for-each select="xsd:schema">
          			<xsl:for-each select="namespace::node()">			
          				<xsl:if test=". = $targetNamespace">
          					<xsl:value-of select="name()"/>
          				</xsl:if>
          			</xsl:for-each>	
          		</xsl:for-each>
          	</xsl:variable>
          Auch wenn ich es nicht glaube, vielleicht hilft's jemandem

          Gruß,
          Taurion

          Comment


          • #6
            oh doch

            Comment

            Working...
            X