Как избежать появления пространства имен в выводе путем записи одного оператора в XSLT

Я написал "exclude-result-prefixes", и даже тогда я вижу появление появления пространства имен в выводе.

<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:simple="Simple name space"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:tcm="http://www.tridion.com/ContentManager/5.0"
    xmlns:xh="http://www.w3.org/1999/xhtml"
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:transform-ext="urn:tridion:transform-ext"
    xmlns="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="#default simple xh">

Фактический выход

<strong xmlns="Simple name space">abcd
    <link xmlns="http://www.w3.org/1999/xhtml">
        <text>Header</text>
    </link>
</strong>

Есть ли какой-либо метод, чтобы я мог исключить все пространство имен, написав один оператор.

Здесь я прямо упомянул

exclude-result-prefixes="#default simple xh"

Как избежать появления пространства имен в xslt?

Ответ 1

Атрибут exclude-result-prefixes xsl:stylesheet, когда он указан как "yes", требует удаления любых узлов пространства имен литералов (только), которые наследуются и не определяют как пространство имен-uri, так и префикс литеральный результат.

Следующая формулировка в ответе Маркуса Жардерота неверна:

"exclude-result-prefixes просто удаляет атрибуты xmlns: foo =" "на корневой тег результата.

Вот контрпример:

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

 <xsl:template match="/">
  <z:x xmlns:z="z:z">
   <z:y/>
  </z:x>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к любому XML-документу (не используется), результат:

<z:x xmlns:z="z:z">
   <z:y/>
</z:x>

Мы видим, что:

  • Пространство имен node (и определение) для пространства имен со значением (namespace-uri) "z: z" не удаляется из верхнего элемента (что Markus Jarderot вызывает "корневой тег" ).

  • Пространство имен с префиксом "z" вообще не удаляется из любого литерала.

Это показывает простой факт, что указание exclude-result-prefixes="yes" не может удалить пространство имен, если оно не находится в LRE (Literal Result Element) и даже если пространство имен node находится в LRE, но определяет пространство имен к которому принадлежит элемент.

Чтобы удалить элемент из пространства имен, которому оно принадлежит, или удалить пространства имен из элементов, отличных от LRE, нам нужно указать некоторую дополнительную обработку.

Одним из примеров является замена традиционного правила идентификации следующим образом:

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

 <xsl:template match="node()[not(self::*)]">
     <xsl:copy>
       <xsl:apply-templates/>
     </xsl:copy>
 </xsl:template>

 <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-документу:

<z:x xmlns:z="z:z">
    <z:y z:attr="someValue"/>
</z:x>

результат преобразования:

<x>
   <y attr="someValue"/>
</x>

Наконец, предупреждение:

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

Ответ 2

exclude-result-prefixes просто удаляет атрибуты xmlns:foo="" в корневом теге результата. Теги все еще привязаны к одному и тому же пространству имен. Так как теги не имеют сопоставимых префиксов, используется пространство имен по умолчанию.

Если вы хотите полностью удалить пространства имен, вы можете использовать следующую таблицу стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="no"/>

    <xsl:template match="/|comment()|processing-instruction()">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

    <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>

(источник: TEI wiki)

Ответ 3

Атрибут exclude-result-prefixes будет (в некоторых случаях) удалять неиспользуемые объявления пространства имен из вывода. Он никогда не удалит пространства имен, которые фактически используются для элемента и атрибутов в результате: то есть он никогда не изменит имена элементов и атрибутов, чтобы поместить их в другое пространство имен (или без пространства имен). Если вы хотите, чтобы элементы не были в пространстве имен, вы должны избегать помещать их в пространство имен при их создании, используя литеральные элементы результата, xsl: element или xsl: copy.

Ответ 4

Попробуйте использовать это в своей таблице стилей:

<stylesheet
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:xhtml="http://www.w3.org/1999/xhtml"   ...etc >

У меня было это внутри некоторых тегов: xmlns="http://www.w3.org/1999/xhtml, поэтому я добавил эти две строки и теперь все нормально.

Этот источник помог мне: http://xmlplease.com/xhtmlxhtml