如何动态设置XSLT转换输出XML的默认命名空间声明?
我可以使用< xsl:namespace>来执行此操作,但不能使用默认命名空间.如果我尝试为默认命名空间执行此操作:
<xsl:namespace name="" select"myUri"/> 它永远不会奏效.它要求我明确定义元素的名称空间,以便能够使用上面的空前缀声明. 编辑1: >我想动态创建命名空间并将其设置为输出xml文档的默认命名空间.命名空间的uri是从输入XML中的某些数据派生的. 编辑2: <xsl:template match="root"> <xsl:param name ="ns">my-computed-namespace</xsl:param> <xsl:element name="newRoot" namespace="{$ns}"/> </xsl:template> 它几乎解决了这个问题.不幸的是,孩子们被变压器注入“”(空白)命名空间.如果我放一个子元素,这就是我得到的: <newRoot xmlns="my-computed-namespace"> <child xmlns=""> ... </child> </newRoot> 为什么变压器会将这个xmlns =“”放在孩子身上?如果我可以阻止这个,那么我找到了我的解决方案. 解决方法
除了提供准确答案的@Tomalak之外,请注意< xsl:namespace>并不打算创建一个名称空间声明,供XSLT处理器使用,通常包含所有元素或属性.
< xsl:namespace>的目的是创建一个特定的命名空间节点.此节点仅具有有限的范围:当前元素或属性以及当前节点的所有子节点(如果它们未将前缀重新分配给另一个名称空间-ur). 使用< xsl:namespace>只有当我们想要为必须动态生成的namespace-uri动态创建命名空间时才是必需的(在转换开始时不是静态知道的).这种情况非常罕见. 在所有情况下,当静态地知道所需的namspace-uri时,只需将该命名空间声明为适当的可见性级别(通常在< xsl:stylesheet>指令处),然后在必须使用此命名空间的任何地方使用关联的前缀. 更新: 以下是XSLT W3C WG编辑Michael Kay博士如何解释: “您需要使用正确的扩展名称创建元素和属性 如果需要这样的结果,解决方案是使用第二遍并将属于“无命名空间”的任何元素转换为所需的新命名空间. 这是在第二遍中使用的转换(两个通道可以组合成一个样式表/转换): <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:variable name="vUrl" select="'my:Url'"/> <xsl:template match="*[namespace-uri()='']"> <xsl:element name="{name()}" namespace="{$vUrl}"> <xsl:copy-of select="@*"/> <xsl:apply-templates/> </xsl:element> </xsl:template> </xsl:stylesheet> 将以上转换应用于以下示例(pass-1-result)xml文档时: <a> <b> <c/> </b> </a> 产生了期望的结果: <a xmlns="my:Url"> <b> <c/> </b> </a> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |