【问题标题】:C# consolidate namespace references in xmlC# 在 xml 中合并命名空间引用
【发布时间】:2011-03-24 00:57:40
【问题描述】:

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

有什么方法可以轻松整合这些。 下面的示例显示了为每个属性指定了 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>

谢谢

克雷格。

【问题讨论】:

  • 好问题,+1。请参阅我的答案以获得一个简单的解决方案。 :)

标签: c# xml xslt namespaces prefix


【解决方案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 文档的大小,因为所有命名空间节点都向下传播到所有后代节点,其中一些可能不需要所有的命名空间。

【讨论】:

    猜你喜欢
    • 2014-07-02
    • 2011-11-06
    • 1970-01-01
    • 2020-03-04
    • 2012-05-05
    • 2011-09-20
    • 2012-10-14
    • 1970-01-01
    • 2015-04-11
    相关资源
    最近更新 更多