Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用XSLT转换在XML中创建xmlns属性_Java_Xml_Xslt_Xml Namespaces - Fatal编程技术网

Java 使用XSLT转换在XML中创建xmlns属性

Java 使用XSLT转换在XML中创建xmlns属性,java,xml,xslt,xml-namespaces,Java,Xml,Xslt,Xml Namespaces,我试图使用JDK Transformer(OracleXMLV2解析器或JAXP)在XSLT转换期间使用参数传递的值将xmlns属性添加到结果XML中,但它始终默认为 我的源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="h

我试图使用JDK Transformer(OracleXMLV2解析器或JAXP)在XSLT转换期间使用参数传递的值将xmlns属性添加到结果XML中,但它始终默认为

我的源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>

不要试图自己创建“xmlns”属性。在XSLT中创建名称空间,它们将自动完成。 此XSLT可以工作(使用Saxon 9.4测试):


并给出以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<process xmlns="http://example.com" xmlns:neil="http://neilghosh.com"/>


XML中的命名空间声明不是属性,即使它们看起来像属性。在XSLT 2.0中,您可以使用
动态地将名称空间声明添加到结果树中,但该功能在XSLT 1.0中不可用。

首先,在XSLT数据模型中,您不想创建属性节点,而是想创建名称空间节点

名称空间节点通常是自动创建的:如果在特定名称空间中创建元素或属性,则处理器会自动添加必需的名称空间节点(因此,序列化时,名称空间声明)

如果希望创建一个不必要的名称空间节点(因为它不用于任何元素或属性的名称),那么在XSLT2.0中可以使用xsl:namespace。如果您坚持使用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>

Michael Kay为您提供了正确的答案,但根据您的评论,您不确定如何在转换中使用它

这是一个完整的转换:

 <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" />

生成所需的正确结果:

<test/>
<process xmlns="http://example.com" xmlns:neil="neilghosh.com" />

终于找到了一个与我的XSLT处理器(Oracle XML V2解析器)一起工作的解决方案

我必须将DOM保存到文件系统,而不是直接输出到文件系统

我用在

以下XSLT片段有效,但有一个额外的xmlns:xmlns=”http://www.w3.org/2000/xmlns/“当我坚持使用文件系统时,它可能被吸收了,并且没有出现在最终输出中

 <process>    
      <xsl:attribute name="xmlns">
        <xsl:value-of select="'http://example.com'"/>
      </xsl:attribute> 
 <process>


我知道这不是最好的方法,但考虑到解析约束,这是我现在唯一的选择。

问题的关键是,xmlns的值应该来自参数[sent by transformer.setParameter(“myNameSpace”)]“myNameSpace”ok-那么元素“process”“应位于来自参数的命名空间中。我将尝试在其内部创建一个元素,该元素具有来自参数的命名空间。。。我需要将它放在根标记中,即processxsl:namespace不太好用。您应该为名称空间使用有效的URI,例如
http://example.com/
,而不是
http://example.com
。如果您将浏览器输入到位置栏中,浏览器会将后者改为前者,但这是在纠正输入上的一个明显错误。你不能有一个没有路径部分的HTTP URI。我在模板下添加了它,但它仍然给我输出当
$ns
变量包含RTF而不是节点集时,这是否有效?我希望首先需要一个
exslt:node-set()
调用或类似调用来转换它。感谢模板下的以下代码不起作用。你能将你的解决方案编辑成我为这个问题需要编写的XSLT吗?@NeilGhosh,也许你听说过
xxx:node-set()
扩展函数?是的,我认为它需要xx:node-set()。对不起,我只是给人们指出了正确的方向,我不会牵着他们的手走到那里——特别是当涉及XSLT1.0时,因为这总是一段不愉快的旅程。谢谢你的回答。我收到以下错误a.xsl:XML-23049:(错误)FOTY0021:节点类型无效这是因为我的JDeveloper的oracle.XML.parser.v2.XSLProcessor吗?有更好的v2解析器方法吗?删除了Oracle v2解析器库并运行了上面的代码,但输出是@NeilGhosh,我已经用我正在使用的所有9个XSLT处理器运行了它——所有这些都生成了我复制并粘贴到这个答案中的输出。您可以使用MSXML、.NET XslCompiledTransform、Saxon、XQSharp或AltovaXML(XML-SPY)吗?我不确定是否可以在代码中使用上述解析。我在NetBeans中运行了相同的代码,它也不必要地给出了ns0前缀