2016-03-03 56 views
1

我需要替换输出中生成的错误名称空间。但是,当我将XML输出转换为XSLTFile时,根元素中生成的名称空间现在是正确的。但是旧的命名空间出现在其他元素中。 非常感谢您的帮助。需要替换名称空间

输入文件:

<Invoice xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" 
     xmlns="http://uri.etsi.org/01903/v1.4.1#" 
     xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"> 
    <cbc:UBLVersionID>2.1</cbc:UBLVersionID> 
    <cbc:CustomizationID>TR1.2</cbc:CustomizationID> 
    <cbc:ProfileID>TEMELFATURA</cbc:ProfileID> 
    <cac:InvoicePeriod> 
    <cbc:StartDate>2016-02-04</cbc:StartDate> 
    <cbc:StartTime>06:00:00</cbc:StartTime> 
    <cbc:DurationMeasure unitCode="DAY">15</cbc:DurationMeasure> 
    </cac:InvoicePeriod> 
</Invoice> 

XSLT FILE:

<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 


<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
     <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/*[local-name()='Invoice']"> 
     <Invoice 
      xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" 
      xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" 
      xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 ../xsdrt/maindoc/UBL-Invoice-2.1.xsd"> 
      <xsl:apply-templates select="@* | node()"/> 
     </Invoice> 
    </xsl:template> 
</xsl:stylesheet> 

产生的输出:

<?xml version="1.0" encoding="UTF-8"?> 
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" 
     xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" 
     xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 ../xsdrt/maindoc/UBL-Invoice-2.1.xsd"> 
    <cbc:UBLVersionID xmlns="http://uri.etsi.org/01903/v1.4.1#">2.1</cbc:UBLVersionID> 
    <cbc:CustomizationID xmlns="http://uri.etsi.org/01903/v1.4.1#">TR1.2</cbc:CustomizationID> 
    <cbc:ProfileID xmlns="http://uri.etsi.org/01903/v1.4.1#">TEMELFATURA</cbc:ProfileID> 
    <cac:InvoicePeriod xmlns="http://uri.etsi.org/01903/v1.4.1#"> 
    <cbc:StartDate>2016-02-04</cbc:StartDate> 
    <cbc:StartTime>06:00:00</cbc:StartTime> 
    <cbc:DurationMeasure unitCode="DAY">15</cbc:DurationMeasure> 
    </cac:InvoicePeriod> 
</Invoice> 

元素GE nerate一个额外的命名空间,这是错误的。

预期输出

<?xml version="1.0" encoding="UTF-8"?> 
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" 
     xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" 
     xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 ../xsdrt/maindoc/UBL-Invoice-2.1.xsd"> 
    <cbc:UBLVersionID>2.1</cbc:UBLVersionID> 
    <cbc:CustomizationID>TR1.2</cbc:CustomizationID> 
    <cbc:ProfileID>TEMELFATURA</cbc:ProfileID> 
    <cac:InvoicePeriod> 
    <cbc:StartDate>2016-02-04</cbc:StartDate> 
    <cbc:StartTime>06:00:00</cbc:StartTime> 
    <cbc:DurationMeasure uniedtCode="DAY">15</cbc:DurationMeasure> 
    </cac:InvoicePeriod> 
</Invoice> 

不管怎么说,我已经尝试过在XSLT我在网上看到很多代码。但它没有奏效。谢谢。

回答

1

实际上应该没有任何问题,你在那里的输出。它有额外的名称空间声明,但它们不会影响输出中任何元素的名称空间。

不过,如果你想忽略他们,你可以添加一个额外的xsl:template,再现所有的后代元素没有复制所有范围的命名空间对他们说:

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

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

    <xsl:template match="/*[local-name()='Invoice']"> 
    <Invoice 
     xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" 
     xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" 
     xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 ../xsdrt/maindoc/UBL-Invoice-2.1.xsd"> 
     <xsl:apply-templates select="@* | node()"/> 
    </Invoice> 
    </xsl:template> 

    <!-- v------------- this template --> 
    <xsl:template match="*"> 
    <xsl:element name="{name()}" namespace="{namespace-uri()}"> 
     <xsl:apply-templates select="@* | node()" /> 
    </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 
+0

嗨@JLRishe,谢谢你的反馈意见。它已经在工作:) – hannah