2009-05-19 11 views
7

Ich habe eine XSL-Datei, um eine andere XSL-Datei zu übertragen. Ich möchte die Namespace-Deklaration auf dem Stamm-Tag sein, anstatt es auf jedem einzelnen Element zu wiederholen !!XSLT-Stamm-Tag-Namespace anstelle von Element-Attribut-Namespace

Hier ist mein Sheet:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mynamespace="somenamespace" version="2.0"> 
    <xsl:output method="xml" omit-xml-declaration="no" standalone="yes" indent="yes" /> 
    <xsl:template match="myMatchedNode"> 
     <mynamespace:tag>Some text i want inserted into the xsl</mynamespace:tag> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /></xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Es gibt so etwas wie dieses:

.... 

<mynamespace:tag xmlns:mynamespace="somenamespace">Some text i want inserted into the xsl</mynamespace:tag> 

.... 

Wie ich die Namespace-Deklaration auf den Root-Tag des Ergebnisses zwingen Sie ?!

Antwort

8

Sie müssen den Namespaceknoten in das Dokumentelement Ihres Ergebnisbaums einfügen. Je nachdem, ob Sie XSLT 1.0 oder 2.0 verwenden, gibt es mehrere Möglichkeiten. Das Folgende ist eine 2.0-Lösung. Ich gehe davon aus, dass Sie auf dem Eingabedokument eine modifizierte Identität verwandeln tun (Ihre Frage spezifizierte nicht wirklich):

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

    <!-- special rule for the document element --> 
    <xsl:template match="/*"> 
    <xsl:copy> 
     <!-- Add a namespace node --> 
     <xsl:namespace name="mynamespace" select="'somenamespace'"/> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <!-- the identity template --> 
    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <!-- the rest of your rules --> 

</xsl:stylesheet> 

Für eine vollständige Abdeckung aller verschiedenen Techniken für die Namespaces in Ihrem Ausgabedokument zu steuern, Schauen Sie sich den Artikel "Not enough namespaces" des Artikels "Namespaces in XSLT" auf meiner Website an.

+1

Sie, Sir, sind eine Legende. Verrückter Link! Vielen Dank! – JavaRocky

+0

Oh! Und ich habe dein Buch. x2 Legendenstatus. – JavaRocky

+0

Danke für Ihre zu freundlichen Worte. :-) –

1

Vielleicht falsch verstehe ich die Frage, aber ich denke, Sie dies tun sollen:

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

<xsl:output method="xml" omit-xml-declaration="no" standalone="yes" indent="yes"/> 

<xsl:template match="myMatchedNode"> 
    <tag>Some text i want inserted into the xsl</mynamespace> 

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

</xsl:stylesheet> 

, wo sollten Sie Ihre Namespace-Tags als Standard-Namespace und das Ausgabedokument verwenden, wird sie als Standard-Namespace als Gut. Ihr Eingabedokument kann weiterhin die unangenehme Syntax myNamespace: tag verwenden.

Sie könnten versuchen, dies zu tun, auch:

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

ich nicht ganz sicher bin, dass MyNamespace ersetzen wird: Tag mit allerdings nur markieren, und wenn es der Fall ist, kann es abhängig von der Implementierung sein.

+0

Nein, ich brauche als Standard-Namespace ist etwas anderes. Dieses XSL ist Teil einer XSLT-Pipeline. – JavaRocky