C#在xml中合并名称空间引用

时间:2010-08-02 04:49:13

标签: c# xml xslt namespaces prefix

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

有没有办法轻松巩固这些。 下面的示例显示了每个属性指定三次的命名空间。 这太可怕了。

我希望文档顶部有前缀,文档中没有名称空间(只是前缀)。是否有编写器或格式化程序选项来实现此目的?

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

由于

克雷格。

1 个答案:

答案 0 :(得分:1)

  

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

     

有没有办法轻松巩固   这些。以下示例显示   命名空间指定三次   每个属性。这太可怕了。

生成这种更紧凑格式的最简单方法是在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文档的大小,因为所有名称空间节点都向下传播到所有后代节点,其中一些可能不需要所有名称空间。