使用XSLT Transformation在XML中创建xmlns属性

Nei*_*eil 3 java xml xslt xml-namespaces

我正在尝试使用JDK Transformer(Oracle XML v2 Parser或JAXP)在XSLT转换期间使用参数传递的值将xmlns属性添加到生成的XML中,但它始终默认为http://www.w3.org/2000/xmlns /

我的源XML

<test/>
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

我的结果

<?xml version="1.0"?>
<process xmlns="http://www.w3.org/2000/xmlns/" xmlns:neil="neilghosh.com">
</process>
Run Code Online (Sandbox Code Playgroud)

我想要的结果

<?xml version="1.0"?>
<process xmlns="http://example.com"  xmlns:neil="neilghosh.com">
</process>
Run Code Online (Sandbox Code Playgroud)

Mic*_*Kay 5

首先,在XSLT数据模型中,您不希望创建属性节点,而是要创建命名空间节点.

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

如果要创建不必要的命名空间节点(因为它未在任何元素或属性的名称中使用),那么在XSLT 2.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>
Run Code Online (Sandbox Code Playgroud)


Dim*_*hev 5

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>
Run Code Online (Sandbox Code Playgroud)

在提供的XML文档上应用此转换时:

<test/>
Run Code Online (Sandbox Code Playgroud)

所需的正确结果产生了:

<process xmlns="http://example.com" xmlns:neil="neilghosh.com" />
Run Code Online (Sandbox Code Playgroud)