XSLT:向非根元素添加显式xmlns标记

XSLT:向非根元素添加显式xmlns标记,xslt,Xslt,我的源文件如下所示: 对于我的目标文件,我必须删除所有名称空间,并在employee标记后添加以下文本: xmlns=“x-schema:file:///C:\lavie\tksql\EMPLOYEE-SCHEMA.XML“ 我创建了一个XSLT映射,成功地删除了ns,但我无法让它在每个employee标记中添加显式xmlns语句 我的XSLT: 有什么想法可以添加到XSLT中,以便在每个员工标记之后添加显式XMLN吗 谢谢 Yoni使用 <xsl:stylesheet ve

我的源文件如下所示:

对于我的目标文件,我必须删除所有名称空间,并在employee标记后添加以下文本:

xmlns=“x-schema:file:///C:\lavie\tksql\EMPLOYEE-SCHEMA.XML“

我创建了一个XSLT映射,成功地删除了ns,但我无法让它在每个employee标记中添加显式xmlns语句

我的XSLT:


有什么想法可以添加到XSLT中,以便在每个员工标记之后添加显式XMLN吗

谢谢

Yoni使用

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="urn:C:\lavie\tksql\Employee-Schema.Xsd" exclude-result-prefixes="ns1">

然后添加模板

<xsl:template match="ns1:employee | ns1:employee//*">
  <xsl:element name="{local-name()}" namespace="x-schema:file:///C:\lavie\tksql\EMPLOYEE-SCHEMA.XML">
    <xsl:apply-templates select="@* | node()"/>
  </xsl:element>
</xsl:template>

注意:由于XML名称空间继承到子(包含的)元素,XML序列化程序可能决定不输出冗余声明。如果您的XSLT处理器具有这种优化功能,您可能会发现,使用此工具不可能在每个元素上都显式地添加xmlns=


当然,因为XML名称空间确实继承到子元素,所以不清楚为什么您认为需要在每个元素上重新声明名称空间绑定。您真正需要的是将它们全部绑定到该名称空间。。。Martin的答案对您有帮助。

XSLT在XPath/XDM数据模型上运行,名称空间声明不是该模型的一部分。相反,名称空间以两种方式显示自己:元素和属性名称有三个部分(前缀、名称空间uri和本地名称),以及元素有名称空间节点

通常(包括在本例中),您不应该担心名称空间节点或名称空间声明:如果您使用正确的三部分名称生成元素,则在序列化结果树时,名称空间声明将自行处理

使用xsl:element时,可以通过以下两种方式之一控制生成元素的三部分名称:

(1) <xsl:element name="pre:local"/>
(1)
将绑定到前缀“pre”的名称空间中的元素(在样式表中)。如果您知道静态需要什么名称空间,那么可以使用此表单

(2) <xsl:element name="local" namespace="{$ns}"/>
(2)

在动态计算命名空间(在运行时)时非常有用。

添加
命名空间uri
属性对我尝试的任何处理器都不起作用;它要么不执行任何操作,要么生成错误:“此元素上不允许使用属性命名空间uri”。@michael.hor257k,很抱歉,属性名称只是
命名空间
,而不是
命名空间uri
,我已更正代码。
(2) <xsl:element name="local" namespace="{$ns}"/>