2013-03-29 28 views
2

我想向元素添加默认名称空间(转换时)。我用xslt进行这个转换。请查找下面的代码片段。默认名称空间不能正确转换

<xsl:variable name="ns" select="'http://ABC.org/Standards/SChool/2'" /> 

<xsl:element name="School" namespace="{$ns}"> 
    <xsl:attribute name="Version">2.13.92</xsl:attribute>  
    <xsl:apply-templates select="ltc:UserAuthRequest" /> 
</xsl:element> 

<xsl:template match="ltc:UserAuthRequest"> 
    <xsl:element name="{local-name()}"> 
</xsl:template> 

转换后,我得到了波纹管xml输出。

<School xmlns="http://ABC.org/Standards/SChool/2" Version="2.13.92"> 
    <UserAuthRequest xmlns=""></UserAuthRequest> 
</School> 

这里的问题是默认命名空间也是在子节点中创建的。

任何人都可以解释为什么名称空间是在子元素中创建的,即使我没有为它定义任何名称空间以及如何避免此问题?

输入XML

<?xml version="1.0" encoding="UTF-8"?> 
<School> 

    <UserAuth> 
     <UserName>K.Senthuran</UserName> 
     <Password>Javaworld</Password> 
    </UserAuth> 

</School> 

转换逻辑

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/School"> 

     <xsl:variable name="ns">www.school.com/myLife</xsl:variable> 
     <xsl:element name="School" namespace="{$ns}"> 
      <xsl:apply-templates select="UserAuth" /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="UserAuth"> 
     <xsl:element name="UserAuth"> 
      <xsl:attribute name="id">sdmnsdnk</xsl:attribute> 

      <xsl:apply-templates select="UserName" /> 
      <xsl:apply-templates select="Password" /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="UserName"> 
     <xsl:element name="{local-name()}"> 
      <xsl:attribute name="userIDREF">dmsdmsl</xsl:attribute> 

      <xsl:value-of select="." /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="Password"> 

     <xsl:element name="{local-name()}"> 
      <xsl:attribute name="uniqueIDREF">asakjhs</xsl:attribute> 

      <xsl:value-of select="." /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="@*"> 
     <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

电流输出

<?xml version="1.0" encoding="UTF-8"?> 
<School xmlns="www.school.com/myLife"> 
    <UserAuth xmlns="" id="sdmnsdnk"> 
     <UserName userIDREF="dmsdmsl">K.Senthuran</UserName> 
     <Password uniqueIDREF="asakjhs">Javaworld</Password> 
    </UserAuth> 
</School> 

期望输出

<?xml version="1.0" encoding="UTF-8"?> 
<School xmlns="www.school.com/myLife"> 
    <UserAuth id="sdmnsdnk"> 
     <UserName userIDREF="dmsdmsl">K.Senthuran</UserName> 
     <Password uniqueIDREF="asakjhs">Javaworld</Password> 
    </UserAuth> 
</School> 
+0

请提供实际的XML文档和确切的通缉令 转型。 –

回答

1

这里是如何做到这一点

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="vNs" select="'some:NS'"/> 

<xsl:template match="*"> 
    <xsl:element name="{name()}" namespace="{$vNs}"> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="@*"> 
    <xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute> 
</xsl:template> 
</xsl:stylesheet> 

当下面的XML文档应用这种转变:

<School Version="2.13.92"> 
    <UserAuthRequest></UserAuthRequest> 
</School> 

通缉,会产生正确的结果:

<School xmlns="some:NS" Version="2.13.92"> 
    <UserAuthRequest/> 
</School> 

更新

的OP澄清了他的问题。现在,一个额外的要求是新的属性添加到一些元素:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="vNs" select="'some:NS'"/> 

<xsl:template match="*"> 
    <xsl:element name="{name()}" namespace="{$vNs}"> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="@*"> 
    <xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute> 
</xsl:template> 

<xsl:template match="UserAuth"> 
    <xsl:element name="{name()}" namespace="{$vNs}"> 
    <xsl:attribute name="id">sdmnsdnk</xsl:attribute> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="UserName"> 
    <xsl:element name="{name()}" namespace="{$vNs}"> 
    <xsl:attribute name="userIDREF">dmsdmsl</xsl:attribute> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 
<xsl:template match="Password"> 
    <xsl:element name="{name()}" namespace="{$vNs}"> 
    <xsl:attribute name="uniqueIDREF">asakjhs</xsl:attribute> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

当这种变换所提供的XML文档应用:

<School> 
    <UserAuth> 
     <UserName>K.Senthuran</UserName> 
     <Password>Javaworld</Password> 
    </UserAuth> 
</School> 

想要的,正确的结果产生:

<School xmlns="some:NS"> 
    <UserAuth id="sdmnsdnk"> 
     <UserName userIDREF="dmsdmsl">K.Senthuran</UserName> 
     <Password uniqueIDREF="asakjhs">Javaworld</Password> 
    </UserAuth> 
</School> 
+0

感谢Dimitre为您的答案。根据你的方法,它按预期工作。但我正在以不同的方式进行改造。我添加一些属性和其他元素。那时它不起作用。请建议我。 –

+0

@ K.Senthuran,请参阅此答案的更新。 –

+0

非常感谢Dimitre。你的建议解决了我的问题。 –

2

的问题是,当你创建UserAuthRequest你不给它一个名称空间

<xsl:element name="{local-name()}" /> 

因此,XSLT将生成没有命名空间的元素,因此xmlns="" 。假设你NS变量的范围是全球性的,只是创建元素以同样的方式,你的学校元素做

<xsl:element name="{local-name()}" namespace="{$ns}" /> 

其实,你并不需要本地名在这里,如果你正在匹配一个特定的元素。这也将工作

<xsl:element name="UserAuthRequest" namespace="{$ns}" /> 
+0

谢谢Tim的回答。在应用您的建议后,我仍面临同样的问题。我想你误解了我的问题。我不想在我的子元素中有任何名称空间。我的意思是元素UserAuthRequest或其任何子元素不应该有任何命名空间。 –