C # консолидировать ссылки на пространство имен в XML - PullRequest
1 голос
/ 02 августа 2010

У меня есть формат 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>

Спасибо

Craig.

1 Ответ

1 голос
/ 17 октября 2010

Форматирование атома, кажется, указывает пространства имен встроены несколько раз.

Есть ли способ легко объединить эти. Пример ниже показывает пространства имен, указанные три раза для каждая собственность. Это ужасно.

Самый простой способ создать этот более компактный формат - применить следующее преобразование XSLT к вашему XML-документу :

<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-документа , поскольку все узлы пространства имен распространяются вниз на все дочерние узлы, некоторые из которых могут вообще не понадобиться это пространство имен.

...