2017-02-16 121 views
0

我试图改变元素的命名空间属性使用下面的XSL代码:XSLT改变命名空间在元素

<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:ns2="http://www.ean-ucc.org/schemas/1.3.1/eanucc"> 
    <xsl:output encoding='UTF-8' indent='yes' method='xml'/> 

    <!-- copy everything into the output --> 
    <xsl:template match='@*|node()'> 
     <xsl:copy> 
      <xsl:apply-templates select='@*|node()'/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="IRenvelope"> 
     <IRL xmlns:xsd="http://www.xx.com"> 
      <xsl:copy-of select="node()|@*"/> 
     </IRL> 
    </xsl:template> 
</xsl:stylesheet> 

我使用用于测试的XML消息是:

<GMessage xmlns="http://www.giffgaff.uk/CM/envelope"> 
<EnvelopeVersion>2.0</EnvelopeVersion> 
    <body> 
    <IRenvelope xmlns="http://www.mnv.com/elc/sap"> 
      <Keys> 
       <Key Type="TaxOfficeNumber">635</Key> 
      </Keys> 
     </IRenvelope> 
    </body> 
</GMessage> 

我不能让它工作,命名空间不变,但收益相同的结果。请帮忙吗?

输出的XML如下:

 <GMessage xmlns="http://www.giffgaff.uk/CM/envelope"> 
     <EnvelopeVersion>2.0</EnvelopeVersion> 
      <body> 
      <IRenvelope xmlns="http://www.xx.com"> 
       <Keys> 
        <Key Type="TaxOfficeNumber">635</Key> 
       </Keys> 
       </IRenvelope> 
      </body> 
     </GMessage> 
+0

在输入XML元素,'IRenvelope',落在命名空间'HTT下号码:// www.mnv.com/ELC/sap'。但是你的XSLT匹配没有这个名字空间的元素'IRenvelope'。此外,您创建的元素“IRL”属于空名称空间。如果您希望它位于'http:// www.xx.com'下,则元素名称应该带有'xsd'前缀('xsd:IRL')。 –

+0

thkx您的反馈。我为IRInvelope处于名称范围之内做了些什么,并将附带的输出提供给我?请输入任何内容? –

回答

1

下面的XSLT将帮助你得到想要的结果:

<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsd="http://www.xx.com" 
    xmlns:ns="http://www.mnv.com/elc/sap" 
    exclude-result-prefixes="ns"> 
    <xsl:output encoding='UTF-8' indent='yes' method='xml'/> 

    <!-- copy everything into the output --> 
    <xsl:template match='@*|node()'> 
     <xsl:copy> 
      <xsl:apply-templates select='@*, node()'/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- template to match ns:IRenvelope element and creating a new element --> 
    <xsl:template match="ns:IRenvelope"> 
     <xsl:element name="IRL" namespace="http://www.xx.com"> 
      <xsl:apply-templates select="@*, node()"/> 
     </xsl:element> 
    </xsl:template> 

    <!-- template to change the namespace 
     of the elements 
     from "http://www.mnv.com/elc/sap" 
     to "http://www.xx.com" --> 
    <xsl:template match="ns:*"> 
     <xsl:element name="{local-name()}" namespace="http://www.xx.com"> 
      <xsl:apply-templates select="@*, node()"/> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

这里,最后两个模板匹配ns:IRenvelope和所有的名称空间分别为http://www.mnv.com/elc/sap的元素。使用xsl:element及其名称空间属性,我们可以创建具有所需名称空间的新元素。

还可以声明与前缀所需的命名空间和创建元素,如下:

<xsd:IRL xmlns:xsd="http://www.xx.com"> 
    ... 
</xsd:IRL> 

对于XSLT-1.0:

只需更换,(逗号)在使用|(管)应用模板如使用逗号来测序的动作被支撑在2.0:

<xsl:apply-templates select="@* | node()"/> 
+0

嗨lingamurthy,thks。我试过这个xslt,但没有多大帮助。与原始xml相同的结果。 –

+0

真的吗? http://xsltransform.net/gWEamLU –

+0

我的道歉,我试图通过altova xml间谍进行测试,但无法让它在那里工作:( –