XSLT 复制元素属性,除非属性位于给定命名空间中

发布于 2024-10-20 22:21:18 字数 916 浏览 1 评论 0原文

这些是 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>

These are SVG elements, and the supplier of the SVG documents has added all kinds of extensions, that we can not use, and do not want. So I'd like these extended attributes removed.

I'm basically using the identity transform. I want this element:

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

to copy as

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

Any help appreciated.

Edit

Unfortunately, the example I chose above wasn't a real one. This one is:

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

and what I want is:

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" 
     >
   <g>
   </g>
</svg>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

百变从容 2024-10-27 22:21:18

此转换

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

更新: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>

This transformation:

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

when applied on the provided XML document:

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

produces the wanted, correct result:

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

UPDATE: The OP now has specified the exact namespace he has the prefix "i" bound to.

In this case a simple replace of "i:i" with http://ns.adobe.com/AdobeIllustrator/10.0/ gives us the new solution:

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

and when applied on the newly-provided XML document:

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

the wanted, correct result is again produced:

<svg xmlns="http://www.w3.org/2000/svg">
  <g />
</svg>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文