【发布时间】:2010-09-13 18:27:24
【问题描述】:
我有一个包含非命名空间元素的 XML 文档,我想使用 XSLT 向它们添加命名空间。大多数元素将在命名空间 A 中;一些将在命名空间 B 中。我该怎么做?
【问题讨论】:
标签: xml xslt namespaces
我有一个包含非命名空间元素的 XML 文档,我想使用 XSLT 向它们添加命名空间。大多数元素将在命名空间 A 中;一些将在命名空间 B 中。我该怎么做?
【问题讨论】:
标签: xml xslt namespaces
使用 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>
这就是你要找的吗?
【讨论】:
这个食谱需要两种主要成分。
酱料将是identity transform,主要风味将通过namespace 属性赋予xsl:element。
以下未经测试的代码应将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>
个人信息:您好,珍妮·坦尼森。我知道你正在阅读这篇文章。
【讨论】:
这是我目前所拥有的:
<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 似乎没有削减它)。
【讨论】: