XSLT头问题

时间:2017-10-19 11:14:20

标签: xml xslt header namespaces root

当前标题

<Invoice xmlns:xs="http://www.w3.org/2001/XMLSchema" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:noNamespaceSchemaLocation="Factuur_insbou003.xsd">

新标题

<Invoice xmlns:xs="http://www.w3.org/2001/XMLSchema" 
         xmlns="http://www.gs1.nl/factuur/insbou/004" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://www.gs1.nl/factuur/insbou/004 
                             Factuur_insbou004.xsd">

我试过了:

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

  <xsl:template match="/*[local-name()= 'Invoice']">
    <Invoice xmlns:xs="http://www.w3.org/2001/XMLSchema" 
             xmlns="http://www.gs1.nl/factuur/insbou/004"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <xsl:copy-of select="node()|@*"/>
    </Invoice>
  </xsl:template>


</xsl:stylesheet>

你是对的(删除了错误的代码),我的问题是创建xmlns =&#34; http://www.gs1.nl/factuur/insbou/004"。希望您能够帮助我。感谢

1 个答案:

答案 0 :(得分:0)

您必须了解命名空间是文档中每个元素的限定名称的一部分,因此您需要使用例如更改每个元素的命名空间。

<xsl:template match="*">
  <xsl:element name="{local-name()}">
    <xsl:apply-templates select="@* | node()"/>
  </xsl:element>
</xsl:template>

然后在样式表根目录上,您可以简单地声明所需的名称空间。但是,当您另外想要向根元素添加属性并省略另一个属性时,您还需要一个模板来执行该操作,因此需要进行所有更改

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
         version="1.0"      
         xmlns="http://www.gs1.nl/factuur/insbou/004" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">


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

    <xsl:template match="/Invoice">
      <Invoice 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        xsi:schemaLocation="http://www.gs1.nl/factuur/insbou/004 
                            Factuur_insbou004.xsd">
          <xsl:apply-templates/>
      </Invoice>
    </xsl:template>

    <xsl:template match="*">
      <xsl:element name="{local-name()}">
        <xsl:apply-templates select="@* | node()"/>
      </xsl:element>
    </xsl:template>

</xsl:transform>