Удаление NamesSpace из XSLT - PullRequest
       17

Удаление NamesSpace из XSLT

4 голосов
/ 08 апреля 2011

Привет, я пишу XSLT и использую функцию <xsl:copy-of>.Теперь, когда он выполняется, тогда namesapce из xml также копируется.Чтобы убрать это я использовал функцию типа <xsl:copy-of select="$RootNode/Child" copy-namespaces="no"/>.Но если у Child есть еще дочерние элементы, то в этом появляются пространства имен.Так может кто-нибудь сказать, пожалуйста, как я могу удалить этоНиже приведен фрагмент моего xslt и XML, который я использую.

<xsl:template match="/">
    <xsl:element name="Parent">
    <xsl:copy-of select="Child" copy-namespaces="no"/>
    </xsl:element>

И XML:

<Child>
<GrandChild>
 <PhoneNumberType>DayPhone</PhoneNumberType>
</GrandChild></Child>

пространства имен не отображаются в CustomerParty, но ониприсутствует в Child, но присутствует в GrandChild.

Ответы [ 2 ]

9 голосов
/ 08 апреля 2011

Атрибут copy-namespaces="no" не удаляет все узлы пространства имен - как указано в спецификации XSLT 2.0 :

Если требуетсязначение no, то ни один из узлов пространства имен не копируется: однако узлы пространства имен все равно будут созданы в дереве результатов, как того требует процесс исправления пространства имен: см. 5.7.3 Исправление пространства имен.Этот атрибут влияет на все элементы, скопированные с помощью этой инструкции: как элементы, выбранные непосредственно выражением выбора, так и элементы, являющиеся потомками узлов, выбранных выражением выбора .

Вот пример того, какизбавиться от всех (необязательных) узлов пространства имен :

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

 <xsl:template match="*">
     <xsl:element name="{local-name()}">
       <xsl:apply-templates select="node()|@*"/>
     </xsl:element>
 </xsl:template>

 <xsl:template match="@*">
  <xsl:attribute name="{local-name()}">
   <xsl:value-of select="."/>
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

Когда это общее преобразование применяется к этому документу XML:

<x:nums xmlns:x="my:x">
  <x:num>01</x:num>
  <x:num>02</x:num>
  <x:num>03</x:num>
  <x:num>04</x:num>
  <x:num>05</x:num>
  <x:num>06</x:num>
  <x:num>07</x:num>
  <x:num>08</x:num>
  <x:num>09</x:num>
  <x:num>10</x:num>
</x:nums>

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

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

Do note :

  1. Преобразование не XSLT-2.0 - специфичен и может использоваться также с XSLT 1.0.

  2. Удаление всех узлов пространства имен обычно небезопасно, поскольку все узлы из разных пространств имен помещаются в «нет пространства имен»,В этом процессе некоторые атрибуты могут быть потеряны, и процесс, как правило, необратим (не 1: 1).

0 голосов
/ 08 апреля 2011

С помощью этого шаблона вы сможете удалить пространства имен:

    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
    </xsl:template>

Также обратитесь к: http://www.devang -gandhi.net / blog / remove-namespace-attribute-from-xml-root-xslt /

Помогает ли это вам решить вашу проблему?

С уважением, Питер

...