Копирование и пр. имен атрибутов

indent

Новичок
Копирование и пр. имен атрибутов

Вначале код файлов
xml:
Код:
<?xml version="1.0"?>

<test xmlns:n="http://www.w3.org">
	<n:elem n:attr="value" attr="value" />
</test>
xsl:
Код:
<?xml version="1.0" encoding="windows-1251"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org" xmlns:n="http://www.w3.org" exclude-result-prefixes="n">
	<xsl:output method="xml" />

	<xsl:template match="/test">
		<blah>
			<xsl:apply-templates />
		</blah>
	</xsl:template>
	
	<xsl:template match="n:elem">
		<xsl:copy>
			<xsl:copy-of select="@n:*" />
			<xsl:attribute name="test">yes</xsl:attribute>
		</xsl:copy>
	</xsl:template>
	
</xsl:stylesheet>
Результат:
Код:
<?xml version="1.0"?>
<blah xmlns="http://www.w3.org">
	<elem xmlns:n="http://www.w3.org" n:attr="value" attr="value" test="yes"/>
</blah>
Особое внимание прошу обратить на атрибуты в результирующем <elem />. В то время, когда я указал копировать атрибуты только из пространства имен n, они почему-то скопировались все, да еще и добавлен был xmlns:n, хотя я прописал, что его добавлять не надо. В чем ошибка?
 

olpa

Новичок
Это не ошибка, это неожиданное поведение в соответствии со спецификацией. xsl:copy и подобные плюют на exclude-result-prefixes. Замените xsl:copy на xsl:element name="{local-name()}".
 

indent

Новичок
Вы внимательно прочитайте мой пост. Copy копирует имя элемента правильно! (из <n:elem /> превращается правильно в <elem />). Вопрос же был про АТРИБУТЫ (название темы). А с атрибутами такие дела, что <xsl:copy-of select="@n:*" /> почему-то копирует все атрибуты, а не только из пространства имен n.
 

olpa

Новичок
А, понял проблему. Похоже, что это баг libxslt. В saxon всё как надо.
Код:
$ xsltproc test.xsl test.xml
<?xml version="1.0"?>

        <elem xmlns:n="http://www.w3.org" xmlns="http://www.w3.org" n:attr="value" attr="value" test="yes"/>
Код:
$ /usr/share/java/saxon/saxon.sh test.xml test.xsl
<?xml version="1.0" encoding="utf-8"?>
        <elem xmlns="http://www.w3.org" xmlns:n="http://www.w3.org" n:attr="value" test="yes"/>
 
Сверху