需要使用XSLT删除输出中的前缀名称空间



有什么方法可以避免填充共同名称空间:输出中的前缀?而且,此名称空间应替换为默认名称空间。我有这个示例文件:

输入:

<IntraConsignment xmlns="http://www.minfin.fgov.be/IntraConsignment" xmlns:common="http://www.minfin.fgov.be/InputCommon" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.minfin.fgov.be/IntraConsignment NewICO-in_v0_7.xsd" IntraListingsNbr="1">
<Representative>
    <common:RepresentativeID identificationType="NVAT" issuedBy="BE">9876941603</common:RepresentativeID>
</Representative>
<IntraListing SequenceNumber="1" ClientsNbr="1" AmountSum="1000.00">
    <Declarant>
        <common:VATNumber>9876941603</common:VATNumber>
    </Declarant>
    <Period>
        <Month>07</Month>
    </Period>
    <IntraClient SequenceNumber="1">
        <CompanyVATNumber issuedBy="DE">123456</CompanyVATNumber>
    </IntraClient>
</IntraListing>
</IntraConsignment>

,我需要删除常见:XML中的前缀,而没有前缀的元素应该具有ns2:前缀:prefix。

我有这个样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://www.minfin.fgov.be/IntraConsignment" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:common="http://www.minfin.fgov.be/InputCommon" xmlns="http://www.minfin.fgov.be/InputCommon" exclude-result-prefixes="xs xsi xsl common">
<xsl:output encoding="UTF-8" indent="yes" method="xml" version="1.0"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="common:*">
    <xsl:element name="{local-name()}">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>
<xsl:template match="*">
    <xsl:element name="ns2:{local-name()}">
        <xsl:apply-templates select="node()|@*"/>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>

我的XSLT非常有效,但是命名空间 XMLNS =" http://www.minfin.fgov.be/inputcommon" 没有出现在输出中。

生成的输出:

<ns2:IntraConsignment xmlns:ns2="http://www.minfin.fgov.be/IntraConsignment" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.minfin.fgov.be/IntraConsignment NewICO-in_v0_7.xsd" IntraListingsNbr="1">
<ns2:Representative>
    <RepresentativeID xmlns="http://www.minfin.fgov.be/InputCommon" identificationType="NVAT" issuedBy="BE">9876941603</RepresentativeID>
</ns2:Representative>
<ns2:IntraListing SequenceNumber="1" ClientsNbr="1" AmountSum="1000.00">
    <ns2:Declarant>
        <VATNumber xmlns="http://www.minfin.fgov.be/InputCommon">9876941603</VATNumber>
    </ns2:Declarant>
    <ns2:Period>
        <ns2:Month>07</ns2:Month>
    </ns2:Period>
    <ns2:IntraClient SequenceNumber="1">
        <ns2:CompanyVATNumber issuedBy="DE">123456</ns2:CompanyVATNumber>
        <ns2:Amount>1000.00</ns2:Amount>
    </ns2:IntraClient>
</ns2:IntraListing>
</ns2:IntraConsignment>

预期:

<ns2:IntraConsignment xmlns:ns2="http://www.minfin.fgov.be/InputCommon" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.minfin.fgov.be/IntraConsignment NewICO-in_v0_7.xsd" xmlns="http://www.minfin.fgov.be/InputCommon" IntraListingsNbr="1">  
<ns2:Representative>
    <RepresentativeID identificationType="NVAT" issuedBy="BE">9876941603</RepresentativeID>
</ns2:Representative>
<ns2:IntraListing SequenceNumber="1" ClientsNbr="1" AmountSum="1000.00">
    <ns2:Declarant>
        <VATNumber>9876941603</VATNumber>
    </ns2:Declarant>
    <ns2:Period>
        <ns2:Month>07</ns2:Month>
    </ns2:Period>
    <ns2:IntraClient SequenceNumber="1">
        <ns2:CompanyVATNumber issuedBy="DE">123456</ns2:CompanyVATNumber>
        <ns2:Amount>1000.00</ns2:Amount>
    </ns2:IntraClient>
</ns2:IntraListing>
</ns2:IntraConsignment>

带有XSLT 1.0名称空间前缀的选择主要留给XSLT处理器,而XSLT 2.0则更具规定性。但是,大多数XSLT 1.0处理器即使不是严格要求的"正确的事情"。

您基本上似乎有两个规则:

(a(命名空间中的元素http://www.minfin.fgov.be/intraconsignment应该使用前缀NS2复制:

<xsl:template match="x:*" xmlns:x="http://www.minfin.fgov.be/IntraConsignment">
  <xsl:element name="ns2:{local-name()}" namespace="http://www.minfin.fgov.be/IntraConsignment">
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

(b(命名空间中的元素http://www.minfin.fgov.be/inputCommon应在默认名称空间中输出:

    <xsl:template match="x:*" xmlns:x="http://www.minfin.fgov.be/InputCommon">
      <xsl:element name="{local-name()}" namespace="http://www.minfin.fgov.be/InputCommon">
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
      </xsl:element>
    </xsl:template>

相关内容

  • 没有找到相关文章

最新更新