XSLT:从 xsl 的输出中删除额外的名称空间

XSLT: Remove Extra NameSpaces from xsl's output

需要建议: 我有一个 XML 文件具有默认名称空间 (xmlns ="http://apr"),需要将其删除,同时保留其余名称空间

 <p:Value xmlns:p="http://www.test.be/communication/xml/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.test/communication/xml/v2 sample.xsd ">
    <Data xmlns ="http://apr"> Extra name space add using xslt need to remove this
    <Name>Apple</Name>
    </Data>
    </p:Value>

几点:

  1. 在 XSLT 中永远记住元素的名称是一个(命名空间, 本地名称)对。

  2. 如果你得到了一个元素的名字(在结果树中),那么 命名空间声明将自行处理

  3. 您需要更改 http://apr 命名空间中的元素名称 从 ("http://apr", *) 到 ("", *)

  4. 要实现这个你需要模板规则:

<xsl:template match="apr:*" xmlns:apr="http://apr"> <xsl:element name="{local-name()}"> <xsl:copy-of select="@*"/> <xsl:apply-templates/> </xsl:element> </xsl:template>

试试下面的代码

<xsl:template match="p:Value"  xmlns:p="http://www.test.be/communication/xml/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.test/communication/xml/v2 sample.xsd ">
<p:Value xmlns:p="http://www.test.be/communication/xml/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.test/communication/xml/v2 sample.xsd ">
      <xsl:apply-templates/>
</p:Value>
  </xsl:template>

<xsl:template match="*" >
     <xsl:element name="{name()}" >
      <xsl:apply-templates/>
     </xsl:element>
  </xsl:template>
</xsl:stylesheet>

在上面的代码中,第一个 xsl:template match="p:Value" 将在获取元素后立即调用,然后它将推送具有该模板中提到的各自名称空间的元素。 稍后它调用 apply-templates 因此它将重定向到下一个带有 match="*" 的模板 在该模板中,我们没有添加名称空间元素,因此它将删除所有其他元素的名称空间。

此致, Vikrant Korde.