XSLT固有命名空间问题:如何为arguments节点添加指定命名空间
XSLT命名空间问题解决:正确生成带指定命名空间的
<xyt:arguments>节点 核心解决思路:直接绑定命名空间,避免xsl:namespace的继承问题
最稳妥的方式是在XSLT根节点提前声明目标命名空间,直接使用前缀生成元素,同时按需添加其他命名空间声明,无需依赖xsl:namespace指令。
示例XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xyt="urn:xytechsystems.com/XytechAPI" exclude-result-prefixes="xsl"> <xsl:template match="/"> <!-- 直接在目标节点上添加NS1命名空间声明 --> <xyt:arguments xmlns:NS1="http://schemahost.amcnetworks.com:8080/amcnesb/schemas"> <!-- 此处放置arguments节点的子内容 --> </xyt:arguments> </xsl:template> </xsl:stylesheet>
代码说明
- 提前声明xyt命名空间:在
xsl:stylesheet节点声明xmlns:xyt="urn:xytechsystems.com/XytechAPI",后续生成<xyt:arguments>时,处理器会自动为该节点添加正确的xmlns:xyt属性。 - 显式添加NS1命名空间:直接在
<xyt:arguments>节点上写入xmlns:NS1属性,确保该命名空间仅绑定在目标节点上。 - 清理多余命名空间:
exclude-result-prefixes="xsl"避免将XSLT自身的命名空间输出到结果XML中。
关于xsl:namespace的问题解析
使用xsl:namespace时,该指令会将命名空间添加到当前节点及其所有子节点上,这就是你遇到的"继承问题"根源。如果不需要子节点继承目标命名空间,这种方式反而会生成多余的命名空间声明,因此不适合当前场景。
备选方案:动态生成命名空间(XSLT 2.0+)
如果需要动态指定命名空间值,可以用xsl:attribute手动生成命名空间属性:
<xsl:template match="/"> <xyt:arguments> <xsl:attribute name="xmlns:xyt" select="'urn:xytechsystems.com/XytechAPI'"/> <xsl:attribute name="xmlns:NS1" select="'http://schemahost.amcnetworks.com:8080/amcnesb/schemas'"/> <!-- 子内容 --> </xyt:arguments> </xsl:template>
注:这种方式仅在需要动态赋值时使用,静态场景下优先选择第一种方案更简洁。
内容的提问来源于stack exchange,提问作者Darina Tolstykh
相关产品推荐
相关产品推荐

