Атрибут пространства имен xsl добавляет пустое пространство имен в дочерний элемент - PullRequest
4 голосов
/ 24 июня 2011

Я добавлял пространство имен в элемент, используя атрибут пространства имен элемента xsl. Это добавляет пустое пространство имен в дочерний элемент в результате.

Вот XSL, который добавляет пространство имен в элемент "Auto"
EDIT - короткая версия моего xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="no"/>
<xsl:template match="/">
    <xsl:element name="Root">
        <xsl:element name="Auto" namespace="http://www.Root.com/XMLSchema/Auto">
            <xsl:element name="Applicant">
                <xsl:element name="ApplicantType">
                    <xsl:text>Applicant</xsl:text>
                </xsl:element>
            </xsl:element>
        </xsl:element>
        <xsl:element name="Life" namespace="http://www.Root.com/XMLSchema/Auto">
            <xsl:element name="Applicant">
                <xsl:element name="ApplicantType">
                    <xsl:text>Applicant</xsl:text>
                </xsl:element>
            </xsl:element>
        </xsl:element>
    </xsl:element>
</xsl:template>

Вот XML, преобразованный XSL

<Root>
<Auto xmlns="http://www.Root.com/XMLSchema/Auto">
    <Applicant xmlns="">
        <ApplicantType>Applicant</ApplicantType>
    </Applicant>
</Auto>
</Root>

Если вы видите элемент Applicant, добавлено преобразование xmlns = "". Как удалить это пустое пространство имен?

Ответы [ 4 ]

6 голосов
/ 24 июня 2011

Мы можем помочь вам лучше, если вы покажете XSL, который производит элементы Applicant и ApplicantType.Кроме того, вы путаете "пространство имен" и "объявление пространства имен" в своем описании проблемы ... разделение этих двух может помочь вам понять решение

Ваш XSL-код явно указывает процессору выводить *Элемент 1005 * без пространства имен.(И, следовательно, ваш код, вероятно, неправильный ... вы хотите, чтобы Applicant находился в том же Auto пространстве имен, что и его родитель.) Поскольку Applicant без префикса унаследует объявление пространства имен по умолчанию от своего родителя, выходной XMLдолжен "undeclare" объявление пространства имен по умолчанию, чтобы поместить Applicant в пространство имен, которое вы не запрашивали.

Например, если ваш код XSL говорит:

<xsl:element name="Auto" namespace="http://www.Root.com/XMLSchema/Auto">
   <xsl:element name="Applicant">

, тогда выприказывает XSL вывести элемент Applicant без пространства имен, как описано выше.Чтобы исправить это, вы можете повторить пространство имен:

<xsl:element name="Auto" namespace="http://www.Root.com/XMLSchema/Auto">
   <xsl:element name="Applicant" namespace="http://www.Root.com/XMLSchema/Auto">

или, как сказал @empo, вы можете объявить префикс пространства имен и использовать его:

<xsl:stylesheet ... xmlns:auto="http://www.Root.com/XMLSchema/Auto">
   ...
      <auto:Auto>
         <auto:Applicant>
            <auto:ApplicantType>
   ...

или использовать объявление пространства имен по умолчаниюв таблице стилей (или шаблоне):

<xsl:stylesheet ... xmlns="http://www.Root.com/XMLSchema/Auto">
   ...
      <xsl:element name="Auto">
         <xsl:element name="Applicant">
   ...
5 голосов
/ 24 июня 2011

Не думайте с точки зрения объявлений пространства имен в поверхностном синтаксисе XML, думайте об именах элементов как о парах (uri, localname).Если вы создаете элемент Applicant, который не находится ни в одном из пространств имен, но его родитель находится в пространстве имен, то сериализатор собирается добавить xmlns = "", чтобы гарантировать, что ваши пожелания будут соблюдаться (т. Е. Иметь кандидата в другом пространстве имен от его родительского элемента).С другой стороны, если вы хотите, чтобы Кандидат находился в пространстве имен "http://www.Root.com/XMLSchema/Auto",", вам нужно убедиться, что он создан в этом пространстве имен. Вы не показали код, который его создал, поэтому мы не можем точно сказать, что именноты сделал не так.

1 голос
/ 27 июня 2011

Ваш выходной документ:

<Root>
<Auto xmlns="http://www.Root.com/XMLSchema/Auto">
    <Applicant xmlns="">
        <ApplicantType>Applicant</ApplicantType>
    </Applicant>
</Auto>
</Root>

И это правильно, если вы посмотрите, как вы указали буквенный URI пространства имен в преобразовании. Фактически вы квалифицировали элементы следующим образом:

{}Root
 -{http://www.Root.com/XMLSchema/Auto}Auto
  -{}Applicant
   -{}ApplicantType

У вас нет квалификации Root, а также Applicant и ApplicantType. Поскольку неквалифицированные имена по умолчанию обрабатываются как элементы, принадлежащие пустому пространству имен (xmlns = ""), ваш выходной документ должен указывать это по крайней мере в тех узлах, которые могут вызвать неоднозначность или неправильную интерпретацию документа.

Что вы, вероятно, пропустили, так это то, что в XSLT , когда в преобразовании вы указываете буквенный URI пространства имен для конкретного элемента, который вы квалифицируете только для этого элемента (ни его потомков, ни любого другого потомка). Таким образом, в XSLT, если вы хотите избавить вас от необходимости определять пространство имен для каждого объявленного элемента, вы должны использовать глобальное пространство имен по умолчанию . Это правильно определит каждый элемент в пространстве имен, а также пропустит большинство объявлений пространства имен в ваших выходных данных. Вы также можете использовать:

exclude-result-prefixes="#default"

для удаления лишних объявлений пространства имен.

Подумайте о добавлении глобального пространства имен с префиксом только в том случае, если оно действительно вам нужно (например, вы знаете, что в выходном документе будут конфликты имен).

Ваш вопрос :

Как удалить это пустое пространство имен?

Вы должны спросить себя сейчас: где квалифицировать мои элементы (и его потомков) (раз и навсегда)?

1 голос
/ 24 июня 2011

Либо элементы Applicant и ApplicantType не имеют пространства имен, в этом случае правильное объявление пустого пространства имен, либо они должны находиться в том же пространстве имен, что и элемент Auto (или, для полноты, в еще одном пространстве имен).В последних случаях вы должны исправить ваше XSL-преобразование.

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