使用XSLT转换的XML创建xmlns属性(Create xmlns attribute in th

2019-07-31 06:10发布

我尝试添加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>

Answer 1:

首先,在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>


Answer 2:

迈克尔·凯为您提供正确的答案,但根据你的意见,你不知道如何在转型中使用它。

这是一个完整的转型

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


Answer 3:

在XML命名空间声明是,即使他们看起来像属性没有属性。 在XSLT 2.0可以使用<xsl:namespace name="neil" select="$myNameSpace" />一个命名空间声明添加到动态结果树,但该功能是不可用XSLT 1.0。



Answer 4:

不要试图打造“的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"/>


Answer 5:

终于得到了与我的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>

我知道这是不是做但鉴于解析约束,这是我现在唯一的选择的最佳方式。



文章来源: Create xmlns attribute in the XML using XSLT Transformation