为元素添加名称空间
时间:2020-03-06 14:50:04 来源:igfitidea点击:
我有一个带有未命名空间元素的XML文档,并且我想使用XSLT向其中添加命名空间。大多数元素将位于名称空间A中;少数将在名称空间B中。如何执行此操作?
解决方案
这是我到目前为止的内容:
<xsl:template match="*"> <xsl:element name="{local-name()}" namespace="A" > <xsl:apply-templates /> </xsl:element> </xsl:template> <xsl:template match="a-special-element"> <B:a-special-element xmlns:B="B"> <xsl:apply-templates /> </B:a-special-element> </xsl:template>
这几乎可以工作;问题在于它没有复制属性。从到目前为止的内容来看,xsl:element无法按原样复制元素中的所有属性(use-attribute-sets似乎无法将其剪切)。
该配方将需要两种主要成分。
调味酱料将进行身份转换,主要风味将由xsl:element的namespace属性提供。
以下未经测试的代码应将http://example.com/命名空间添加到所有元素。
<xsl:template match="*"> <xsl:element name="xmpl:{local-name()}" namespace="http://example.com/"> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template>
个人讯息:我们好,Jeni Tennison。我知道你在读这本书。
使用foo.xml
<foo x="1"> <bar y="2"> <baz z="3"/> </bar> <a-special-element n="8"/> </foo>
和foo.xsl
<xsl:template match="*"> <xsl:element name="{local-name()}" namespace="A" > <xsl:copy-of select="attribute::*"/> <xsl:apply-templates /> </xsl:element> </xsl:template> <xsl:template match="a-special-element"> <B:a-special-element xmlns:B="B"> <xsl:apply-templates match="children()"/> </B:a-special-element> </xsl:template> </xsl:transform>
我懂了
<foo xmlns="A" x="1"> <bar y="2"> <baz z="3"/> </bar> <B:a-special-element xmlns:B="B"/> </foo>
那是你要找的东西吗?