Спецификация схемы XML прямо запрещает атрибуты с именем xmlns
, поэтому таблица стилей XSLT не может создавать такие атрибуты напрямую, используя <xsl:attribute>
. Я вижу только два варианта для вас ...
Один из вариантов - создать фиктивные атрибуты, используя другое имя (например, xmlnsx
):
<xsl:template match="/">
<xsl:element name="root">
<xsl:attribute name="xmlnsx">http://something</xsl:attribute>
<xsl:element name="node">
<xsl:attribute name="xmlnsx">http://something</xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:template>
... и затем замените все вхождения атрибута xmlnsx
на xmlns
на некотором этапе постобработки (например, SAX-фильтр или другой потоковый редактор). Однако это решение включает в себя вставку не-XSLT-шага в конвейер.
Другой вариант - чистый, но безобразный, XSLT. Вы можете сгенерировать необходимый XML напрямую, используя xsl:text
и disable-output-escaping
, например:
<xsl:template match="/">
<xsl:text disable-output-escaping="yes"><root xmlns="http://something"></xsl:text>
<xsl:text disable-output-escaping="yes"><node xmlns="http://something"></xsl:text>
<xsl:text disable-output-escaping="yes"></root></xsl:text>
</xsl:template>
Обратите внимание, что спецификация XSLT 1.0 довольно рыхлая, когда дело доходит до сериализации, поэтому конкретный процессор XSLT все еще может исключить избыточные объявления пространства имен из этого второго решения. Тем не менее, он работал на четырех процессорах, которые я пробовал (а именно Saxon, MSXML, MSXML.NET и LIBXML).