我在我的XSL中有以下内容,它为我的 XML添加了一个xmlns. xsl:template match="root" xsl:element name="root" namespace="myXslLoc" xsl:attribute name="Name"Default/xsl:attribute xsl:apply-templates/ /xsl:elementxsl:template 上面
<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>
我不知道steps元素中的xmlns来自哪里.我没有指定将xmlns添加到steps元素的代码.下面是我的xsd的snipet:
<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有什么问题吗?我似乎无法弄清楚问题的来源.
谢谢.
编辑:
在Dimitre的转换代码之后,我设法将namespace属性插入到根元素中.但是,更改后的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文档最后一个元素的名称空间,不包括通过转换添加的名称空间.
编辑:
更新了addLastNodes xsl.
这种转变:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext" > <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:param name="pNamespace" select="'myXslLoc'"/> <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()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="/*/steps/step[position()=last()]"> <xsl:call-template name="repNamespace"/> <xsl:apply-templates select="ext:node-set($addLastNodes)/*"/> </xsl:template> <xsl:template match="*" name="repNamespace"> <xsl:element name="{name()}" namespace="{$pNamespace}"> <xsl:copy-of select="namespace::*"/> <xsl:apply-templates select="node()|@*"/> </xsl:element> </xsl:template> </xsl:stylesheet>
应用于此XML文档时:
<root> <steps> <step>1</step> <step>2</step> <step>3</step> </steps> </root>
产生想要的,正确的结果:
<root xmlns="myXslLoc"> <steps> <step>1</step> <step>2</step> <step>3</step> <step Name="Total Cost"> <items> <item name="A"/> <item name="b"/> </items> </step> </steps> </root>