2012-03-28 8 views
2

Meine xsl-Datei:Ohne Namensraum von XML

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:go="http://www.google.com" 
    exclude-result-prefixes="go"> 
<xsl:include href="SomeLibrary.xsl"/> 

    <xsl:template match="/"> 

     <xsl:call-template name="SomeTemplate"> 
      <xsl:with-param name="Element" select="'randomParam'"/> 
     </xsl:call-template> 

    </xsl:template> 

</xsl:stylesheet> 

Die SomeLibrary.xsl Datei:

<?xml version="1.0" encoding="utf-8"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.google.com"> 
    <xsl:template name="SomeTemplate"> 
    <xsl:param name="Element"/> 
     <Blabla> 
      <xsl:value-of select="$Element" />  
     </Blabla> 
    </xsl:template> 
</xsl:stylesheet> 

Eingang xml: nur ein leeres XML verwenden. Das Ergebnis ist dieses:

<?xml version="1.0" encoding="UTF-8"?> 

<Blabla xmlns="http://www.google.com"> 
    randomParam 
</Blabla> 

Was ich will, ist die „Blabla“ Knoten ohne einen Namensraum zu haben. Wie kann ich es entfernen oder sicherstellen, dass es nicht dorthin gelangt, ohne meine "SomeLibrary.xsl" zu ändern?

Antwort

2

Falls Sie nicht wollen, das importierten Stylesheet-Code bearbeiten, wird die Art und Weise den Namespace zu entfernen, ist mit einer Zwei-Pass-Transformation (die in XSLT 1.0 erfordert eine xxx:node-set() Erweiterung Funktion):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext" > 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:variable name="vrtfPass1"> 
    <xsl:call-template name="SomeTemplate"> 
       <xsl:with-param name="Element" select="'randomParam'"/> 
     </xsl:call-template> 
    </xsl:variable> 

    <xsl:variable name="vPass1" select="ext:node-set($vrtfPass1)"/> 
    <xsl:apply-templates select="$vrtfPass1/node()" mode="pass2"/> 
</xsl:template> 

<xsl:template match="*" mode="pass2"> 
    <xsl:element name="{name()}"> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates mode="pass2"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template name="SomeTemplate" xmlns="http://www.google.com"> 
    <xsl:param name="Element"/> 
      <Blabla> 
       <xsl:value-of select="$Element" /> 
      </Blabla> 
</xsl:template> 
</xsl:stylesheet> 

Wenn diese Transformation auf jedem XML-Dokument (nicht benutzt), das gewünschte Ergebnis (der Standard-Namespace entfernt) angewandt wird, wird hergestellt:

<Blabla>randomParam</Blabla> 

Update:

Der OP hat in einem Kommentar angegeben, dass er Xalan 2.07 verwendet.

Unten ist fast die gleiche Lösung, aber mit Namespace und Namen für die xxx:node-set() Funktion verwendet, wie in Xalan:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:x="xmlns:xalan="http://xml.apache.org/xalan" exclude-result-prefixes="x" > 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:variable name="vrtfPass1"> 
    <xsl:call-template name="SomeTemplate"> 
       <xsl:with-param name="Element" select="'randomParam'"/> 
     </xsl:call-template> 
    </xsl:variable> 

    <xsl:variable name="vPass1" select="x:nodeset($vrtfPass1)"/> 
    <xsl:apply-templates select="$vrtfPass1/node()" mode="pass2"/> 
</xsl:template> 

<xsl:template match="*" mode="pass2"> 
    <xsl:element name="{name()}"> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates mode="pass2"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template name="SomeTemplate" xmlns="http://www.google.com"> 
    <xsl:param name="Element"/> 
      <Blabla> 
       <xsl:value-of select="$Element" /> 
      </Blabla> 
</xsl:template> 
</xsl:stylesheet> 
+0

Ich habe es versucht und es funktioniert nicht ("compile" -Fehler). Danke für die Mühe. Ich werde das irgendwann in der Zukunft noch einmal Revue passieren lassen. – Buffalo

+0

@Buffalo: Ich teste meinen Code immer vor der Veröffentlichung - wenn Sie nur diese Umwandlung (streng kopieren und einfügen, keine Änderungen) auf die bereitgestellten Quell-XML-Dokument anwenden (streng kopieren und einfügen, keine Änderungen) - dann muss das Ergebnis Sei der eine in dieser Antwort. Wenn etwas nicht "kompiliert" wird, bedeutet dies, dass Sie die Transformation oder das XML-Dokument oder beides modifiziert haben. –

+0

@DimitreNovatchev schöne Zwei-Pass-Lösung; Ich werde dieses für zukünftige Referenz speichern! – Maestro13

0

Fügen Sie exclude-result-prefixes="go" zum Stylesheet-Element hinzu.
und natürlich, aktualisieren Sie die Namespace-Deklaration aus dem Standard eines bis xmlns:go="http://www.google.com"

+0

Wo genau? Es ist bereits in meiner XSL-Datei hinzugefügt. – Buffalo

+0

in SomeLibrary.xsl, aber ich merke jetzt, dass Sie das nicht bearbeiten möchten. Ich frage mich dann auch, ob es eine andere Möglichkeit gibt, dies zu tun ... – Maestro13

1

Explizit schaffen sie mit:

<xsl:element name="Blabla" namespace="">...</xsl:element> 

aber dies bedeutet, mit der SomeLibrary.xsl Datei Hantieren.