2013-03-29 21 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或其任何子元素不應該有任何命名空間。 –