2017-01-05 4 views
0

Ich habe so einen einfachen XML für TestXLS-Transformation - ignorieren Namespace

<test xmlns="urn:entsoe.eu:wgedi:ecan:totalallocationresultsdocument:6:0"> 
    <Domain v="old"/> 
</test> 

und diese XSL-Transformation

<xsl:stylesheet version="2.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes" /> 

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

    <xsl:template match="Domain/@v[.='old']"> 
     <xsl:attribute name="v" > 
      <xsl:value-of select="'New'"/> 
     </xsl:attribute> 
    </xsl:template>  
</xsl:stylesheet> 

ich brauche "Alte" Wert auf Domain-Element auf "Neu" Wert ersetzen . Es ist perfekt für den Fall, dass ich xmlns-Tag in der Beispiel-XML entfernen werde. Wenn jedoch xmlns angezeigt wird, funktioniert die Umwandlung nicht. Gibt es irgendwelche Konfigurationsparameter, um xmlns zu ignorieren oder wie man es anders machen kann?

Dank

+0

Bitte suchen Sie nach „xslt Standard-Namespace“ und Sie werden 1000 Antworten auf diese Frage zu finden. –

Antwort

1

Die „xmlns“ stellt eine Standard-Namespace-Deklaration, und es etwas, das Sie sollten nicht wirklich ignorieren, sondern müssen Sie Ihre XSLT ändern für diesen Namensraum zu berücksichtigen.

Da Sie XSLT 2.0 verwenden, kann dies mit xpath-default-namespace erreicht werden. Dies bedeutet, dass alle Elemente in Ihren xpath-Ausdrücken, die kein Namespace-Präfix haben, so behandelt werden, als befänden sie sich im angegebenen Namespace.

dieses XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="urn:entsoe.eu:wgedi:ecan:totalallocationresultsdocument:6:0"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes" /> 

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

    <xsl:template match="Domain/@v[.='old']"> 
     <xsl:attribute name="v" > 
      <xsl:value-of select="'New'"/> 
     </xsl:attribute> 
    </xsl:template>  
</xsl:stylesheet> 

EDIT Versuchen: Wenn Sie nicht wirklich wissen, was der Namensraum sein wird, Sie einen Platzhalter für den Namespacepräfix in XSLT 2.0 verwenden können.

Versuchen Sie, diese zu

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:output method="xml" encoding="UTF-8" indent="yes" /> 

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

    <xsl:template match="*:Domain/@v[.='old']"> 
     <xsl:attribute name="v" > 
      <xsl:value-of select="'New'"/> 
     </xsl:attribute> 
    </xsl:template>  
</xsl:stylesheet> 
+0

Danke Tim, aber mein Ziel ist ein bisschen kompliziert, da ich die endgültige Anzahl der xmlns-Namespaces nicht kenne. Meine Eingabe-XML-Dateien können unterschiedliche xmlns haben und auch einige XML-Dateien können keine xmlns enthalten. Hast du eine Idee, wie du das lösen kannst? –

+0

Ich habe meine Antwort geändert, um zu zeigen, wie Sie mit einem Platzhalter einen beliebigen Namespace abgleichen können. –

+0

Vielen Dank Tim. –