除非属性在给定的命名空间中,否则XSLT会复制元素属性

时间:2011-03-08 20:46:06

标签: xslt

这些是SVG元素,SVG文档的供应商添加了我们不能使用但不想要的各种扩展。所以我希望删除这些扩展属性。

我基本上使用身份变换。我想要这个元素:

<text id="1" 
      i:knockout="Off" 
      i:objectType="pointText" 
      style="font-size:16;"
     >Hi</text>

复制为

<text id="1" style="font-size:16;">Hi</text>

任何帮助表示感谢。

修改

不幸的是,我上面选择的例子不是真实的。这个是:

<?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>

1 个答案:

答案 0 :(得分:0)

此转化

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

应用于提供的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>

UPDATE :OP现在已经指定了绑定前缀"i"的确切命名空间。

在这种情况下,"i:i"http://ns.adobe.com/AdobeIllustrator/10.0/的简单替换为我们提供了新的解决方案:

<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:param name="pUnwantedNS" select="'http://ns.adobe.com/AdobeIllustrator/10.0/'"/>

    <xsl:template match="*">
        <xsl:element name="{name()}" namespace="{namespace-uri()}">
            <xsl:copy-of select="namespace::*[not(.=$pUnwantedNS)]"/>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="@*">
        <xsl:copy-of select="."/>
    </xsl:template>

    <xsl:template match=
    "@*[namespace-uri()='http://ns.adobe.com/AdobeIllustrator/10.0/']"/>
</xsl:stylesheet>

,当应用于新提供的XML文档时:

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

再次生成想要的正确结果

<svg xmlns="http://www.w3.org/2000/svg">
  <g />
</svg>