2013-03-10 15 views
5

uwzględniając następujące XML wejściowego:Usunąć deklarację przestrzeni nazw XML z wyjściowego katalogu głównego XSLT?

<?xml version="1.0" encoding="utf-8" ?> 
<customSettings xmlns:env="urn:schemas-test-env"> 
    <connectionStrings> 
     <add name="Name" connectionString="None" providerName="" /> 
     <add name="Name" connectionString="Local" providerName="" env:name="Local" /> 
     <add name="Name" connectionString="Dev" providerName="" env:name="Dev" /> 
    </connectionStrings> 
    <appSettings> 
     <add key="Name" value="Value" /> 
     <add key="Name" value="Local" env:name="Local" /> 
     <add key="Name" value="Dev" env:name="Dev" /> 
    </appSettings> 
</customSettings> 

i XSLT:

<?xml version="1.0" encoding="utf-8" ?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt" 

       xmlns:code="urn:schemas-test-code" 
       xmlns:env="urn:schemas-test-env" 
> 
    <xsl:output version="1.0" encoding="utf-8" omit-xml-declaration="yes" indent="yes" /> 
    <xsl:strip-space elements="*" /> 

    <!-- Populate param value --> 
    <xsl:param name="env" select="code:GetEnvironment()" /> 

    <!-- Copy content as is --> 
    <xsl:template match="node()|@*" name="identity"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*" /> 
     </xsl:copy> 
    </xsl:template> 

    <!-- Remove all add nodes with env:name not matching param --> 
    <xsl:template match="add"> 
     <xsl:if test="not(@env:name != $env)"> 
      <xsl:call-template name="identity" /> 
     </xsl:if> 
    </xsl:template> 

    <!-- Remove all env:name attributes --> 
    <xsl:template match="@env:name" /> 
</xsl:stylesheet> 

Dostaję następujące XML wyjściowe:

<customSettings xmlns:env="urn:schemas-test-env"> 
    <connectionStrings> 
    <add name="Name" connectionString="None" providerName="" /> 
    <add name="Name" connectionString="Local" providerName="" /> 
    </connectionStrings> 
    <appSettings> 
    <add key="Name" value="Value" /> 
    <add key="Name" value="Local" /> 
    </appSettings> 
</customSettings> 

Jak usunąć deklarację przestrzeni nazw z elementu głównego ?

Odpowiedz

3

Jeśli zastąpi ten szablon:

<!-- Copy content as is --> 
<xsl:template match="node()|@*" name="identity"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*" /> 
    </xsl:copy> 
</xsl:template> 

Z tych dwóch szablonach:

<!-- Copy elements without copying their namespace declarations --> 
<xsl:template match="*" name="identity"> 
    <xsl:element name="{name()}"> 
    <xsl:apply-templates select="node()|@*" /> 
    </xsl:element> 
</xsl:template> 

<!-- Copy content as is --> 
<xsl:template match="node()|@*" priority="-2"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*" /> 
    </xsl:copy> 
</xsl:template> 

Wtedy to powinno wystarczyć.

+0

Czy to możliwe, aby nie używać priorytetu? – abatishchev

+0

@atatischev nie, ponieważ 'match =" * "' i 'match =" node() "' mają domyślnie taki sam priorytet. –

+0

@abatishchev Myślę, że nie potrzebujesz atrybutu priorytetu, jeśli po prostu użyjesz '' zamiast drugiego szablonu. – nwellnhof

5

W XSLT 2.0 można użyć

<xsl:copy copy-namespaces="no"> 
+0

Używam .NET, więc niestety ograniczone z 1.0. – abatishchev

+0

Nie tak, .NET jest dobrze obsługiwany z procesorami XSLT 2.0 - są dwa doskonałe, Saxon i XmlPrime. –

+1

Tak, oczywiście, istnieje wiele, ale nie po wyjęciu z pudełka. To miałem na myśli – abatishchev

3

Czy próbowałeś dodanie wykluczają-result-prefiksy = "env" do swojej deklaracji arkusza stylów? Powinien działać, jak poniżej:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt" 

       xmlns:code="urn:schemas-test-code" 
       xmlns:env="urn:schemas-test-env" 
       exclude-result-prefixes="env" 
> 
Powiązane problemy