XSLT 标头问题

Posted

技术标签:

【中文标题】XSLT 标头问题【英文标题】:XSLT header problems 【发布时间】:2018-03-31 09:59:30 【问题描述】:

当前标题

<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="http://www.gs1.nl/factuur/insbou/004"。希望您能够帮助我。谢谢

【问题讨论】:

不清楚是什么问题…… 问题:我无法添加xmlns="gs1.nl/factuur/insbou/004" 【参考方案1】:

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

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

【讨论】:

以上是关于XSLT 标头问题的主要内容,如果未能解决你的问题,请参考以下文章

XSLT转换需要添加SOAP信封并在SOAP标头和正文之间拆分XML

XSLT - 删除前缀命名空间特定节点 XML

选择字段元素时不确定 XSLT 文档中的当前路径

XSLT 变量问题

是否可以用另一个 XSLT 代码(元 XSLT)转换 XSLT 代码?

XSLT:XML 节点呈现问题