Ответ 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>
Наконец, предупреждение:
Это преобразование может быть вредным, если оно применяется к документам, содержащим два элемента (или два атрибута), которые имеют одно и то же локальное имя, но относятся к двум различным пространствам имен - преобразование заменяет их элементами (или атрибутами), которые принадлежат к такое же пространство имен (без пространства имен).