2009-06-11 8 views
4

ein XML-Kopieren:Namespaces Umgehen während mit XSLT

<Root> 
    <A>foo</A> 
    <B></B> 
    <C>bar</C> 
</Root> 

Ich beantrage eine XSLT das 'C' Element zu entfernen:

<?xml version="1.0" ?> 

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

<xsl:output method="html" indent="no" encoding="utf-8" /> 

<xsl:template match="*"> 
     <xsl:copy> 
       <xsl:copy-of select="@*" /> 
       <xsl:apply-templates /> 
     </xsl:copy> 
</xsl:template> 

<xsl:template match="C" /> 

</xsl:stylesheet> 

und ich am Ende mit dem folgenden XML (es ist OK ‚B‘ nicht zusammengebrochen zu haben, weil ich HTML als Ausgabemethode verwenden bin):

<Root> 
    <A>foo</A> 
    <B></B> 
</Root> 

Aber dann, wenn ich e Ver erhält eine andere XML, diesmal mit einem Namensraum:

<Root xmlns="http://company.com"> 
    <A>foo</A> 
    <B></B> 
    <C>bar</C> 
</Root> 

Das Element 'C' wird nach dem XSLT-Prozess nicht entfernt.

Was kann ich tun, um diesen Namensraum zu umgehen, gibt es einen Weg?

+0

Was für die Erklärung der der Grund ist "http://www.w3.org/1999/XSL/Transform" Namespace zweimal in deinem ? Die Standard-Namespace-Deklaration sollte entfernt werden, IMHO. – Tomalak

+0

Es gibt eigentlich keinen Grund, mein Schlechter. –

Antwort

9

nicht so zu empfehlen, aber funktioniert:

<xsl:template match="*[local-name()='C']" /> 

Besser:

<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:foo="http://company.com" 
    exclude-result-prefixes="foo" 
> 

    <!-- ... --> 

    <xsl:template match="C | foo:C" /> 

    <!-- ... --> 

</xsl:stylesheet> 
+0

Großartig! Vielen Dank, es funktioniert :-) –

+0

Ich würde den "nicht so empfehlenswerten" Teil debattieren, aber ich will das ganze Ding nicht wieder starten :) – annakata

+0

@annakata: Ich weiß. :-) Aber mir geht es gut mit der ersten Annäherung. Ich sage nur, dass der zweite sauberer ist. Und führt wahrscheinlich besser. ;-) – Tomalak