1

我有一个xml如下

<Publication xmlns:n1="http://www.w3.org/2001/XMLSchema-instance" n1:noNamespaceSchemaLocation="InformaKMSStructure.xsd"

我想复制所有 XML 但不是xmlns:n1="http://www.w3.org/2001/XMLSchema-instance" 和 n1:noNamespaceSchemaLocation="InformaKMSStructure.xsd"

4

2 回答 2

2

这种转变

<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:apply-templates select="node()|@*"/>
     </xsl:element>
 </xsl:template>

 <xsl:template match="node()[not(self::*)]|@*">
  <xsl:copy/>
 </xsl:template>

 <xsl:template match=
 "@*[namespace-uri() = 'http://www.w3.org/2001/XMLSchema-instance']"/>
</xsl:stylesheet>

应用于以下 XML 文档时(未提供!):

<Publication
 xmlns:n1="http://www.w3.org/2001/XMLSchema-instance"
 n1:noNamespaceSchemaLocation="InformaKMSStructure.xsd">
  <a x="y">
   <b/>
  </a>

  <c/>
</Publication>

产生想要的正确结果:

<Publication>
   <a x="y">
      <b/>
   </a>
   <c/>
</Publication>

说明

这遵循覆盖标识规则的通常模式,但是标识规则被两个模板替换——一个匹配任何元素,第二个匹配任何其他节点或属性。

于 2012-05-24T11:26:08.133 回答
1

n1:noNamespaceSchemaLocation="InformaKMSStructure.xsd" 是一个普通属性,在 XSLT 中“删除”它的方法是避免复制它。如果您在 XSLT 中不执行任何操作,则不会产生任何输出,因此如果您想避免输出某些内容,那么您需要找到输出它的代码并进行更改。您尚未向我们展示您的代码,因此我们无法告诉您如何更改它。

xmlns:n1="http://www.w3.org/2001/XMLSchema-instance" 不同:在 XPath 数据模型中,它不被视为属性,而是作为名称空间。事实上,这个命名空间声明的存在导致命名空间节点出现在其范围内的每个元素上。要摆脱这些命名空间,您需要了解哪些指令复制命名空间,哪些不复制。在 XSLT 1.0 中,xsl:copy 和 xsl:copy-of 在应用于元素时,复制所有元素的名称空间(无论是在该元素上还是在祖先上声明)。要阻止这种情况发生,在 XSLT 2.0 中您可以使用<xsl:copy copy-namespaces="no">,但在 1.0 中,唯一的选择是使用 xsl:element 而不是 xsl:copy 来重构元素。

于 2012-05-24T13:02:41.470 回答