Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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
Xml XSLT删除一些属性_Xml_Xslt - Fatal编程技术网

Xml XSLT删除一些属性

Xml XSLT删除一些属性,xml,xslt,Xml,Xslt,我的XML文档中可以以任何形式出现以下XML: 首先,在XSLT/XPath数据模型中,只有xsi:schemaLocation是一个属性。如果您根本不想复制该属性或任何属性,那么就不要这样做,因为在那里您可以显式复制所有属性。或者,如果您希望有选择地指定不复制哪些属性,那么就不要将放在中,而是编写一个用于复制属性的模板,然后为您不想复制的属性编写模板,例如 <xsl:template match="@*"> <xsl:copy/> </xsl:template

我的XML文档中可以以任何形式出现以下XML:


首先,在XSLT/XPath数据模型中,只有
xsi:schemaLocation
是一个属性。如果您根本不想复制该属性或任何属性,那么就不要这样做,因为在那里您可以显式复制所有属性。或者,如果您希望有选择地指定不复制哪些属性,那么就不要将
放在
中,而是编写一个用于复制属性的模板,然后为您不想复制的属性编写模板,例如

<xsl:template match="@*">
  <xsl:copy/>
</xsl:template>

<xsl:template match="@xsi:schemaLocation"/>

对于
xmlns:xsi
,这是一个名称空间声明,在XSLT/XPath数据模型中它不是一个属性。如果您对元素节点所做的只是显示的模板,那么我看不出应该如何将名称空间复制到输出中


但是,如果您也在样式表中定义名称空间,则需要在
xsl:stylesheet
元素上进行
exclude result prefixes=“xsi”

下面是生成所需结果的完整转换:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="http://www.thenamespace.com">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="x:Message">
  <xsl:element name="{name()}" namespace="http://www.theNEWnamespace.com">
    <xsl:copy-of select="@*[not(name() = 'xsi:SchemaLocation')]"/>
    <xsl:apply-templates/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档时(未提供任何转换!):


生成所需的正确结果:

<Message xmlns="http://www.theNEWnamespace.com"/>


名称空间节点是必需的,因为该属性属于此名称空间。它必须由XSLT处理器创建,因为匹配所有元素的通用模板不会复制名称空间节点。Dimitre,你说得对,他的代码复制了所有属性,他将获得任何名称空间属性的名称空间声明。但是,如果Mike不想要属性,并且按照我的建议不复制它们,那么他的元素模板doing
xsl:element
将不会导致未使用名称空间的任何名称空间声明。这正是我的答案产生所需结果的原因。添加了结构,以防需要更改,目前似乎不起作用,因此假设该结构可能遗漏了某些内容。@迈克:在您提供的XML中,默认名称空间是不同的。在我的解决方案中更改它:从
“http://www.thenamespace.com“
”http://www.thenamespace“
--或者最好更正您的问题,wich同时使用两个名称空间,而且是矛盾的。@Mike:属性名称之间也有不匹配之处--请更正,那么我的解决方案将适用于您。更正后,它就可以工作了,抱歉,造成上述错误的打字错误!您提供的XML文档的默认名称空间与您在本问题开始时指定的名称空间不同。请更正。另一个问题是属性的名称不同:
“xsi:schemaLocation”
“xsi:schemaLocation”
——请更正。@DimitreNovatchev,更正。
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="http://www.thenamespace.com">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="x:Message">
  <xsl:element name="{name()}" namespace="http://www.theNEWnamespace.com">
    <xsl:copy-of select="@*[not(name() = 'xsi:SchemaLocation')]"/>
    <xsl:apply-templates/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>
<t>
  <Message
  xsi:SchemaLocation="http://www.location.com StructureFile.xsd"
  xmlns="http://www.thenamespace.com"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</t>
<Message xmlns="http://www.theNEWnamespace.com"/>