1

我有由 atom 格式化程序格式化的 xml。原子格式化程序似乎多次内联指定命名空间。

有什么方法可以轻松地巩固这些。下面的示例显示了为每个属性指定了 3 次的命名空间。这太可怕了。

我想要文档顶部的前缀,并且文档中没有命名空间(只是前缀)。是否有编写器或格式化程序选项来实现这一点?

<property p3:name="firstname" xmlns:p3="http://a9.com/-/opensearch/extensions/property/1.0/" xmlns="http://a9.com/-/opensearch/extensions/property/1.0/">Drikie</property>

谢谢

克雷格。

4

1 回答 1

1

原子格式化程序似乎多次内联指定命名空间。

有什么方法可以轻松地巩固这些。下面的示例显示了为每个属性指定了 3 次的命名空间。这太可怕了。

产生这种更紧凑格式的最简单方法是在您的 XML 文档上应用以下 XSLT 转换

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

 <xsl:template match="*">
  <xsl:element name="{name()}" namespace="{namespace-uri()}">
   <xsl:copy-of select="descendant::*/namespace::*"/>
   <xsl:copy-of select="namespace::*"/>

   <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

例如,当应用于以下 XML 文档时(基于您的问题):

<t xmlns="http://a9.com/-/opensearch/extensions/property/1.0/">
<property p3:name="firstname"
  xmlns:p3="http://a9.com/-/opensearch/extensions/property/1.0/"
  xmlns="http://a9.com/-/opensearch/extensions/property/1.0/"
  >Drikie</property>
</t>

产生了想要的结果

<t
 xmlns="http://a9.com/-/opensearch/extensions/property/1.0/"
 xmlns:p3="http://a9.com/-/opensearch/extensions/property/1.0/">
    <property p3:name="firstname">Drikie</property>
</t>

请注意

  1. 命名空间声明不能在具有将相同前缀绑定到另一个命名空间的声明的元素之上进一步提升

  2. 将命名空间声明提升为祖先元素可能会增加解析的 XML 文档的大小,因为所有命名空间节点都向下传播到所有后代节点,其中一些可能根本不需要该命名空间。

于 2010-10-17T18:31:03.987 回答