2009-01-08 7 views
10

ich folgendes Element erstellen möchten:erstellen xmlns: xsi-Namespace und Attribut

<exercises xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mySchema.xsd"> 

Wenn ich etwas wie folgt verwenden:

<xsl:element name="excercises"> 
<xsl:attribute name="xmlns:xsi" namespace="http://www.w3.org/2001/XMLSchema-instance"/> 

Dann erstellt es soemthing wie folgt aus:

<excercises xp_0:xsi="" xmlns:xp_0="http://www.w3.org/2001/XMLSchema-instance"> 

Das sieht nicht ähnlich, was ich will ...

+0

Welchen XSLT-Parser verwenden Sie? – Kev

Antwort

8

Versuchen Sie Folgendes statt:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="@* | node()"> 
     <xsl:apply-templates select="xml"></xsl:apply-templates> 
    </xsl:template> 

    <xsl:template match="xml"> 
     <xsl:element name="exercises"> 
      <xsl:attribute name="xsi:noNamespaceSchemaLocation">mySchema.xsd</xsl:attribute> 
      some value 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

Das Hauptanliegen ist es, den xsi-Namespace in der Erklärung zu erklären.

Ich habe gerade die Vorlage übereinstimmen, nur um zu testen.

+0

Da das msxsl-alais nicht verwendet wird, könnte es besser sein, wenn Sie es einfach entfernt haben, würde es das Beispiel klarer machen – AnthonyWJones

+0

yeah .... Ich habe gerade die MS cruft – Kev

+0

thx viel aufgeräumt, und geben Sie Ihrer Katze eine huggy – eddy147

2

Hier ist, wie dies kann erfolgen:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
exclude-result-prefixes="xsi"> 
    <xsl:output omit-xml-declaration="yes"/> 
    <!--         --> 
    <xsl:template match="/"> 
     <exercises xsi:noNamespaceSchemaLocation="mySchema.xsd"/> 
    </xsl:template> 
</xsl:stylesheet> 

Wenn diese Transformation auf einer beliebigen Quelle XML-Dokument angewendet wird (nicht benutzt), das gewünschte Ergebnis produziert:

<exercises xsi:noNamespaceSchemaLocation="mySchema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> 

Es ist nicht notwendig <xsl:attribute> in Ihrem Fall zu verwenden, aber wenn nötig, kann es ohne Probleme verwendet werden:

<xsl:attribute name="xsi:noNamespaceSchemaLocation"> 
     <xsl:value-of select="'mySchema.xsd'"/> 
    </xsl:attribute> 

Sie beachten Sie, dass es eine gute Praxis ist, die erforderlichen Namespaces am <xsl:stylesheet> Element so einfach zu definieren, dass sie leicht (wieder) verwendet überall sein können sie gebraucht werden. Dies ist besonders nützlich, wenn ein bestimmter Namespace für mehr als ein generiertes Element oder Attribut benötigt wird.

In diesem Fall ist es auch gut, alle diese Präfixe in den Wert des exclude-result-prefixes Attribut angeben, so dass die Namensräume werden nicht automatisch auf alle wörtlichen Ergebniselemente vermehrt werden.

+0

Warum würden Sie das xsi-Ergebnispräfix unterdrücken? – AnthonyWJones

+0

@AnthonyWJones: Wenn Sie das Präfix "xsi" nicht in die Werteliste für das Attribut "exclude-result-prefixes" aufnehmen, wird jedes literale Ergebniselement mit diesem Namespace-Knoten ausgegeben. Dies ist der einzige Zweck der e.r.ptr. Lesen Sie hier: http://www.w3.org/TR/xslt#literal-result-element –

1

Sie könnten einfach verwenden: -

<exercises xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mySchema.xsd"> 

direkt in Ihrem XSL, das funktionieren würde, nur wirklich xsl brauchen: Element kann nicht hart Code der Tag-Name. Ähnlich mit Attributen können Sie sie direkt hinzufügen, es sei denn Sie müssen bedingte machen.