В моем XSL есть следующее, которое добавляет xmlns в мой XML.
<xsl:template match="root">
<xsl:element name="root" namespace="myXslLoc">
<xsl:attribute name="Name">Default</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
<xsl:template>
Вышеприведенное добавляет атрибут xmlns к корневому элементу (элемент верхнего уровня). Однако он также добавил xmlns к последующему элементу. Вот как это оказалось:
<root Name="Default" xmlns="myXslLoc">
<steps xmlns=""> <-- where did this attribute come from?
.
.
.
</steps>
</root>
Понятия не имею, откуда этот xmlns в элементе steps. У меня нет кода, который определяет добавление xmlns к элементу steps. Ниже приведен фрагмент моего xsd:
<xs:complexType name="root">
<xs:sequence>
<xs:element name="steps" type="steps" maxOccurs="1" MinOccurs="1"/>
</xs:sequence>
<xs:attribute name="Name" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="steps">
<xs:sequence>
<xs:element name="step" type="step" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
Что-то не так в моем xsl или xsd? Я не могу понять, откуда возникла проблема.
Спасибо.
EDIT:
После кода преобразования Димитре мне удалось вставить атрибут пространства имен в корневой элемент. Однако в преобразованном XML-документе появилось больше экземпляров атрибута пространства имен.
Вот что произошло:
<root Name="Default" xmlns="myXslLoc">
<steps> <-- where did this attribute come from?
<step name="A">
.
</step>
.
.
<!-- the below is the final steps element -->
<step name="Z" xmlns=""> <-- this xmlns was unexpectedly added.
<steps xmlns="myXslLoc"> <-- this one as well.
.
.
.
</steps>
</step>
<step Name="Step manually added by identity transformation (addLastNode stuff)">
.
.
.
</step>
</steps>
</root>
xsl выглядит примерно так:
<xsl:template match="root">
<xsl:element name="root namespace="myXslLoc">
<xsl:attribute name="Name">Default</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
<xsl:template>
<xsl:template match="*">
<xsl:element name="{name()}" namespace="{$addMyXslLoc}">
<xsl:copy-of select="namespace::*"/>
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
<xsl:template>
<xsl:param name="addMyXslLoc" select="'myXslLoc'"/>
<xsl:template match="/*/steps/step[position()=last()]">
<xsl:call-template name="identity"/>
<xsl:copy-of select="$addLastNodes"/>
</xsl:template>
<xsl:param name="addLastNodes">
<step Name="Total Cost">
<items>
<item name="A">
</item>
<item name="b">
</item>
</items>
</step>
</xsl:param>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
Мне понравилось, как пространство имен теперь отображается в корневом элементе (вместе с атрибутом Name). Но теперь я сталкиваюсь с проблемой невозможности избавиться от пространств имен, которые были вставлены в последний элемент XML-документа, исключая тот, который добавлен с помощью преобразования.
EDIT:
Обновлен addLastNodes xsl.