gpt4 book ai didi

xml - 使用 XSLT : namespace issue 删除标签

转载 作者:行者123 更新时间:2023-12-04 16:55:45 24 4
gpt4 key购买 nike

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

不幸的是, from 的命名空间声明并没有被完全删除,而是以某种方式“粘”到下一个标签:
<?xml version="1.0" encoding="utf-8" ?> 
<n0:ToRemain xlmns:n0="https://somethingelse.com/def.xsd"
xlmns:prx="urn:something">
<Data>
...
</Data>
</n0:ToRemain>

有任何想法吗?

谢谢!!!

最佳答案

在您似乎正在使用的 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>

关于xml - 使用 XSLT : namespace issue 删除标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45214297/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com