Как удалить имена из непустых пространств имен, к которым они принадлежат? - PullRequest
2 голосов
/ 02 декабря 2010

Я хочу преобразовать входной XML-файл, используя xslt, чтобы изменить имя определенного элемента, который может появляться в разных местах XML-дерева.

У меня есть XML, подобный следующему,

 <catalog>
 <cd>
  <ost:title>Empire Burlesque</ost:title>
  <artist>Bob Dylan</artist>
  <country>USA</country>
  <company>
     <ost:name>Columbia<ost:name>
  </company>
  <price>10.90</price>
  <year>1985</year>
 </cd>
</catalog>

Я хочу удалить весь префикс 'ost:' из всех элементов и оставить все остальное в том виде, в котором он использует xslt.Пример кода будет оценен.

Ответы [ 2 ]

2 голосов
/ 02 декабря 2010

В вашем примере у вас нет других пространств имен, кроме того, которое вы хотите удалить. Итак, вот пример таблицы стилей XSLT, которая удаляет все пространства имен из элементов (а не только из ost:).

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <!-- identity template: copy everything as is... -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- ... except for elements, 
       create a similarly named element without a namespace -->
  <xsl:template match="*">
    <xsl:element name="{local-name()}">
      <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

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

Если вы хотите просто удалить свое пространство имен ost:, вы можете включить объявление пространства имен для этого пространства имен и изменить последний шаблон, чтобы он соответствовал ost:*.

0 голосов
/ 03 декабря 2010

Это преобразование является наиболее общим.Он удаляет все элементы и атрибуты из пространств имен, указанных в глобальном параметре.Он также удаляет все узлы пространства имен, которые являются одним из этих пространств имен :

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

 <my:delNs>
   <ns>some:namespace1</ns>
   <ns>some:namespace3</ns>
 </my:delNs>

 <xsl:variable name="vdelNS"
  select="document('')/*/my:delNs/*"/>

 <xsl:template match="*">
  <xsl:element name="{name()}" namespace="{namespace-uri()}">
   <xsl:copy-of select="namespace::*[not(.=$vdelNS)]"/>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="@*">
  <xsl:copy-of select="."/>
 </xsl:template>

 <xsl:template priority="10" match=
 "*[namespace-uri()=document('')/*/my:delNs/*]">

  <xsl:element name="{local-name()}">
   <xsl:copy-of select="namespace::*[not(.=$vdelNS)]"/>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match=
 "@*[namespace-uri()=document('')/*/my:delNs/*]">
   <xsl:attribute name="{local-name()}">
    <xsl:value-of select="."/>
   </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

, когда это преобразование применяется к следующему документу XML (на основе предоставленного, но исправленного набыть правильно сформированными и расширенными, чтобы содержать 3 пространства имен и элементы и атрибуты в них):

 <catalog xmlns:ost="some:namespace1"
  xmlns:x="some:namespace2"
  xmlns:y="some:namespace3">
 <cd>
  <ost:title>Empire Burlesque</ost:title>
  <y:artist>Bob Dylan</y:artist>
  <country>USA</country>
  <company ost:type="big">
     <ost:name>Columbia</ost:name>
  </company>
  <x:price>10.90</x:price>
  <year>1985</year>
 </cd>
</catalog>

желаемый результат получается :

<catalog xmlns:x="some:namespace2">
   <cd>
      <title>Empire Burlesque</title>
      <artist>Bob Dylan</artist>
      <country>USA</country>
      <company type="big">
         <name>Columbia</name>
      </company>
      <x:price>10.90</x:price>
      <year>1985</year>
   </cd>
</catalog>

Объяснение :

  1. Первые два шаблона почти эквивалентны правилу идентификации, но они не копируют узлы пространства имен для пространств имен, указанных в <my:delNs>.

  2. Последние два шаблона предназначены для всех элементов и атрибутов, принадлежащих пространству имен, указанному в <my:delNs>.Только в этих двух шаблонах имена фактически заменяются только локальными именами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...