Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
除非属性位于给定的命名空间中,否则XSLT会复制元素属性_Xslt - Fatal编程技术网

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

除非属性位于给定的命名空间中,否则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;">

这些都是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;">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:我做了这些机械性的改变并更新了我的答案。请不要急于说某些东西“不起作用”: