我是XSLT的新手。
我尝试创建一个简单的转换,从XML文件中删除某个标记。我试图删除的标记有一个名称空间声明。想法是摆脱以下输入:
<?xml version="1.0" encoding="utf-8" ?>
<ToBeRemoved xlmns:prx="urn:something">
<n0:ToRemain xlmns:n0="https://somethingelse.com/def.xsd">
<Data>
...
</Data>
</n0:ToRemain>
</ToBeRemoved>
以下内容:
<?xml version="1.0" encoding="utf-8" ?>
<n0:ToRemain xlmns:n0="https://somethingelse.com/def.xsd">
<Data>
...
</Data>
</n0:ToRemain>
我使用以下XSLT:
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*" >
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="ToBeRemoved">
<xsl:apply-templates select="node()|@*" />
</xsl:template>
</xsl:transform>
不幸的是,来自don的命名空间声明被完全删除了,但是&#34;坚持&#34;不知何故到下一个标签:
<?xml version="1.0" encoding="utf-8" ?>
<n0:ToRemain xlmns:n0="https://somethingelse.com/def.xsd"
xlmns:prx="urn:something">
<Data>
...
</Data>
</n0:ToRemain>
有什么想法吗?
感谢!!!
答案 0 :(得分:1)
在您似乎正在使用的XSLT 1.0中,xsl:copy
指令还复制了复制节点范围内的所有名称空间。
为了防止这种情况,请创建一个新元素,而不是复制现有元素 - 即替换身份转换模板:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
使用:
<xsl:template match="*">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
和(可选)(如果您还有要保留的属性和/或注释和/或处理说明):
<xsl:template match="@*">
<xsl:attribute name="{name()}" namespace="{namespace-uri()}">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:template>
<xsl:template match="comment() | processing-instruction()">
<xsl:copy/>
</xsl:template>