我尝试添加xmlns属性与使用JDK变压器(甲骨文XML解析器V2或JAXP)XSLT转换过程中参数传递的值生成的XML,但它始终默认为http://www.w3.org/2000/xmlns /
我的源XML
<test/>
我的XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://example.com">
<xsl:param name="myNameSpace" select="'http://neilghosh.com'"/>
<xsl:template match="/">
<process>
<xsl:attribute name="xmlns:neil">
<xsl:value-of select="$myNameSpace"/>
</xsl:attribute>
</process>
</xsl:template>
</xsl:stylesheet>
我的结果
<?xml version="1.0"?>
<process xmlns="http://www.w3.org/2000/xmlns/" xmlns:neil="neilghosh.com">
</process>
我要的结果
<?xml version="1.0"?>
<process xmlns="http://example.com" xmlns:neil="neilghosh.com">
</process>
首先,在XSLT数据模型,你不希望创建一个属性节点,您要创建一个命名空间节点。
命名空间节点通常自动创建:如果在一个特定的命名空间创建的元素或属性,所需的命名空间节点(并且因此,串行化时,命名空间声明)被由处理器自动添加。
如果你想创建是没有必要的命名空间节点(因为它不是在任何元素或属性的名称中使用),那么在XSLT 2.0,你可以使用xsl:名称空间。 若你坚持使用XSLT 1.0,然后有一个变通方法,这涉及到创建在相关命名空间中的元素,然后复制其命名空间节点:
<xsl:variable name="ns">
<xsl:element name="neil:dummy" namespace="{$param}"/>
</xsl:variable>
<process>
<xsl:copy-of select="$ns/*/namespace::neil"/>
</process>
迈克尔·凯为您提供正确的答案,但根据你的意见,你不知道如何在转型中使用它。
这是一个完整的转型 :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pNamespace" select="'neilghosh.com'"/>
<xsl:variable name="vDummy">
<xsl:element name="neil:x" namespace="{$pNamespace}"/>
</xsl:variable>
<xsl:template match="/*">
<xsl:element name="process" namespace="http://example.com">
<xsl:copy-of select="namespace::*"/>
<xsl:copy-of select="ext:node-set($vDummy)/*/namespace::*[.=$pNamespace]"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
当这种转化应用所提供的XML文档:
<test/>
在想,正确的结果产生:
<process xmlns="http://example.com" xmlns:neil="neilghosh.com" />
在XML命名空间声明是,即使他们看起来像属性没有属性。 在XSLT 2.0可以使用<xsl:namespace name="neil" select="$myNameSpace" />
一个命名空间声明添加到动态结果树,但该功能是不可用XSLT 1.0。
不要试图打造“的xmlns”属性自己。 创建于XSLT的命名空间,他们将被自动完成。 这XSLT作品(与撒克逊9.4测试):
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:neil="neilghosh.com"
xpath-default-namespace="http://example.com"
xmlns="http://example.com" version="2.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:param name="myDynamicNamespace" select="'http://neilghosh.com'"/>
<xsl:template match="/">
<xsl:element name="process">
<xsl:namespace name="neil" select="$myDynamicNamespace"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
并给出了下面的输出:
<?xml version="1.0" encoding="UTF-8"?>
<process xmlns="http://example.com" xmlns:neil="http://neilghosh.com"/>
终于得到了与我的XSLT处理器工作的解决方法(甲骨文XML解析器V2)
我不得不将其转换为DOM文档 ,然后坚持认为DOM到文件系统,而不是直接输出到StreamResult
我用DOMResult在变换方法
下面的XSLT片段的工作,但有一个额外的xmlns:的xmlns =“http://www.w3.org/2000/xmlns/”,这很可能是由吸收文档 ,当我坚持到文件系统并没有出现在最终的输出。
<process>
<xsl:attribute name="xmlns">
<xsl:value-of select="'http://example.com'"/>
</xsl:attribute>
<process>
我知道这是不是做但鉴于解析约束,这是我现在唯一的选择的最佳方式。