如何使用 XSLT 删除 xml 名称空间别名
How to remove xml namespace aliases by using XSLT
我试图转换下面的 xml,它在所有标签上都有 xml 命名空间别名。
输入:
<?xml version="1.0" encoding="UTF-8"?>
<ns1:Header xmlns:ns1="abc.com">
<ns1:Child1>
<ns1:Child11>a</ns1:Child11>
<ns1:Child12>b</ns1:Child12>
<ns1:Child13>
<ns1:Picks>
<ns1:pick1>1</ns1:pick1>
<ns1:pick2>2</ns1:pick2>
</ns1:Picks>
</ns1:Child13>
</ns1:Child1>
</ns1:Header>
期望的输出:
<?xml version="1.0" encoding="UTF-8"?>
<Header xmlns:ns1="abc.com">
<Child1>
<Child11>a</Child11>
<Child12>b</Child12>
<Child13>
<Picks>
<pick1>1</pick1>
<pick2>2</pick2>
</Picks>
</Child13>
</Child1>
</Header>
是否有更简单的开箱即用的 XSLT 方法来完成此任务?
如果我对你的问题的解释正确,你想更改 Header
.
的子元素的名称空间
这可以通过以下模板实现:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="abc.com" >
<xsl:output method="xml" indent="yes"/>
<xsl:template match="*"> <!-- Removes all ns1 namespaces from the child elements -->
<xsl:element name="{local-name()}">
<xsl:apply-templates select="node()|@*" />
</xsl:element>
</xsl:template>
<xsl:template match="ns1:Header"> <!-- Removes the ns1 namespace from the Header element but keeps an xmlns:ns1 definition -->
<Header xmlns:ns1="abc.com">
<xsl:apply-templates select="node()|@*" />
</Header>
</xsl:template>
</xsl:stylesheet>
其输出为:
<?xml version="1.0"?>
<Header xmlns:ns1="abc.com">
<Child1>
<Child11>a</Child11>
<Child12>b</Child12>
<Child13>
<Picks>
<pick1>1</pick1>
<pick2>2</pick2>
</Picks>
</Child13>
</Child1>
</Header>
如有必要,添加标识模板以复制缺失的元素。
如果您想更改所有元素的默认名称空间,这将简化为这个模板:
<xsl:template match="*"> <!-- Changes the default namespaces of all elements -->
<xsl:element name="{local-name()}" namespace="abc.com">
<xsl:apply-templates select="node()|@*" />
</xsl:element>
</xsl:template>
在这种情况下,输出将是:
<?xml version="1.0"?>
<Header xmlns="abc.com">
<Child1>
<Child11>a</Child11>
<Child12>b</Child12>
<Child13>
<Picks>
<pick1>1</pick1>
<pick2>2</pick2>
</Picks>
</Child13>
</Child1>
</Header>
我试图转换下面的 xml,它在所有标签上都有 xml 命名空间别名。
输入:
<?xml version="1.0" encoding="UTF-8"?>
<ns1:Header xmlns:ns1="abc.com">
<ns1:Child1>
<ns1:Child11>a</ns1:Child11>
<ns1:Child12>b</ns1:Child12>
<ns1:Child13>
<ns1:Picks>
<ns1:pick1>1</ns1:pick1>
<ns1:pick2>2</ns1:pick2>
</ns1:Picks>
</ns1:Child13>
</ns1:Child1>
</ns1:Header>
期望的输出:
<?xml version="1.0" encoding="UTF-8"?>
<Header xmlns:ns1="abc.com">
<Child1>
<Child11>a</Child11>
<Child12>b</Child12>
<Child13>
<Picks>
<pick1>1</pick1>
<pick2>2</pick2>
</Picks>
</Child13>
</Child1>
</Header>
是否有更简单的开箱即用的 XSLT 方法来完成此任务?
如果我对你的问题的解释正确,你想更改 Header
.
的子元素的名称空间
这可以通过以下模板实现:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="abc.com" >
<xsl:output method="xml" indent="yes"/>
<xsl:template match="*"> <!-- Removes all ns1 namespaces from the child elements -->
<xsl:element name="{local-name()}">
<xsl:apply-templates select="node()|@*" />
</xsl:element>
</xsl:template>
<xsl:template match="ns1:Header"> <!-- Removes the ns1 namespace from the Header element but keeps an xmlns:ns1 definition -->
<Header xmlns:ns1="abc.com">
<xsl:apply-templates select="node()|@*" />
</Header>
</xsl:template>
</xsl:stylesheet>
其输出为:
<?xml version="1.0"?>
<Header xmlns:ns1="abc.com">
<Child1>
<Child11>a</Child11>
<Child12>b</Child12>
<Child13>
<Picks>
<pick1>1</pick1>
<pick2>2</pick2>
</Picks>
</Child13>
</Child1>
</Header>
如有必要,添加标识模板以复制缺失的元素。
如果您想更改所有元素的默认名称空间,这将简化为这个模板:
<xsl:template match="*"> <!-- Changes the default namespaces of all elements -->
<xsl:element name="{local-name()}" namespace="abc.com">
<xsl:apply-templates select="node()|@*" />
</xsl:element>
</xsl:template>
在这种情况下,输出将是:
<?xml version="1.0"?>
<Header xmlns="abc.com">
<Child1>
<Child11>a</Child11>
<Child12>b</Child12>
<Child13>
<Picks>
<pick1>1</pick1>
<pick2>2</pick2>
</Picks>
</Child13>
</Child1>
</Header>