使用XLST:名称空间问题删除标记

时间:2017-07-20 12:09:48

标签: xml xslt namespaces

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

有什么想法吗?

感谢!!!

1 个答案:

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