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>
几点:
在 XSLT 中永远记住元素的名称是一个(命名空间,
本地名称)对。
如果你得到了一个元素的名字(在结果树中),那么
命名空间声明将自行处理
您需要更改 http://apr 命名空间中的元素名称
从 ("http://apr", *) 到 ("", *)
要实现这个你需要模板规则:
<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.
需要建议: 我有一个 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>
几点:
在 XSLT 中永远记住元素的名称是一个(命名空间, 本地名称)对。
如果你得到了一个元素的名字(在结果树中),那么 命名空间声明将自行处理
您需要更改 http://apr 命名空间中的元素名称 从 ("http://apr", *) 到 ("", *)
要实现这个你需要模板规则:
<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.