除非属性位于给定的命名空间中,否则XSLT会复制元素属性
这些都是SVG元素,SVG文档的供应商添加了各种扩展,我们不能使用,也不想使用。所以我想删除这些扩展属性 我基本上使用的是身份转换。我想要这个元素:除非属性位于给定的命名空间中,否则XSLT会复制元素属性,xslt,Xslt,这些都是SVG元素,SVG文档的供应商添加了各种扩展,我们不能使用,也不想使用。所以我想删除这些扩展属性 我基本上使用的是身份转换。我想要这个元素: <text id="1" i:knockout="Off" i:objectType="pointText" style="font-size:16;" >Hi</text> Hi 抄袭 <text id="1" style="font-size:16;">
<text id="1"
i:knockout="Off"
i:objectType="pointText"
style="font-size:16;"
>Hi</text>
Hi
抄袭
<text id="1" style="font-size:16;">Hi</text>
Hi
谢谢你的帮助
编辑
不幸的是,我上面选择的例子不是一个真实的例子。这个是:
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/"
i:viewOrigin="-39.4106 906.6265" i:rulerOrigin="0 0" i:pageBounds="0 840 592 0" >
<g i:extraneous="self">
</g>
</svg>
我想要的是:
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg"
>
<g>
</g>
</svg>
此转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:copy-of select=
"namespace::*[not(.='i:i')]"/>
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*[namespace-uri()='i:i']"/>
<xsl:template match="@*">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
<svg xmlns="http://www.w3.org/2000/svg">
<g />
</svg>
应用于新提供的XML文档时:
<text id="1" xmlns:i="i:i"
i:knockout="Off"
i:objectType="pointText"
style="font-size:16;">Hi</text>
<text id="1" style="font-size:16;">Hi</text>
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/"
i:viewOrigin="-39.4106 906.6265"
i:rulerOrigin="0 0"
i:pageBounds="0 840 592 0" >
<g i:extraneous="self"></g>
</svg>
再次生成所需的正确结果:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:copy-of select=
"namespace::*[not(.='i:i')]"/>
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*[namespace-uri()='i:i']"/>
<xsl:template match="@*">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
<svg xmlns="http://www.w3.org/2000/svg">
<g />
</svg>
如果您正在使用标识转换,您只需为这些属性添加一个空规则,其模式类似于@i:
(当然,您需要一个正确的名称空间声明…)问得好,+1。请参阅我的答案,以获得完整、简短且简单的解决方案。:)@亚历杭德罗:是的,但这不会从元素中删除不需要的名称空间节点。我的解决方案删除了这个不需要的名称空间节点。@Alejandra-是的,我刚刚用正确的@I:*解决了这个问题。这花了一点时间,因为我也有类型I:的元素,最后我需要两种模式来匹配这两种模式。谢谢。名称空间::*[不是(namespace-uri()='i:i')]
看起来很奇怪-名称空间节点的名称是ns前缀,它没有uri部分。在2.0中,空规则当然可以使用模式match=“i:*”
@Michael Kay:感谢您注意到这一点。立即修复。对于我给出的过于简化的示例,这确实有效。我已经更新了一个更真实的名称空间。@Tim-R:我无法知道您使用的“I”
绑定到的实际名称空间。只需在我的回答中用替换“i:i”
http://ns.adobe.com/AdobeIllustrator/10.0/转换产生了想要的结果。@Tim-R:我做了这些机械性的改变并更新了我的答案。请不要急于说某些东西“不起作用”: