2013-03-10 20 views
5

Có XML sau đầu vào:Xóa khai báo không gian tên XML khỏi gốc đầu ra 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> 

và 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> 

Tôi nhận được XML đầu ra sau đây:

<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> 

Làm thế nào để loại bỏ khai namespace từ phần tử gốc ?

Trả lời

3

Nếu bạn thay thế mẫu này:

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

Với hai mẫu sau đây:

<!-- 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> 

Sau đó, mà nên làm điều đó.

+0

Có thể không sử dụng 'mức độ ưu tiên' không? – abatishchev

+0

@abatischev không, vì 'match =" * "' và 'match =" node() "' có cùng mức độ ưu tiên theo mặc định. –

+0

@abatishchev Tôi nghĩ bạn không cần thuộc tính ưu tiên nếu bạn chỉ sử dụng '' thay vì mẫu thứ hai. – nwellnhof

5

Trong XSLT 2.0, bạn có thể sử dụng

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

Tôi sử dụng .NET nên không may bị giới hạn với 1.0. – abatishchev

+0

Không phải như vậy, .NET được phục vụ tốt với bộ xử lý XSLT 2.0 - có hai trình xử lý tuyệt vời, Saxon và XmlPrime. –

+1

Có, chắc chắn, có rất nhiều nhưng không ra khỏi hộp. Ý tôi là thế – abatishchev

3

Bạn đã thử thêm loại trừ-Kết quả-tiền tố = "env" để khai stylesheet của bạn? Nên hoạt động, như sau:

<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" 
>