我想将默认名称空间(转换时)添加到元素中。我使用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 :(得分:2)
问题在于,当您创建 UserAuthRequest 时,您没有给它命名空间
<xsl:element name="{local-name()}" />
因此,XSLT将生成一个没有命名空间的元素,因此xmlns=""
。假设您的 ns 变量的范围是全局的,只需按照与学校元素相同的方式创建元素
<xsl:element name="{local-name()}" namespace="{$ns}" />
实际上,如果要匹配特定元素,则此处不需要 local-name 。这也可行
<xsl:element name="UserAuthRequest" namespace="{$ns}" />
答案 1 :(得分: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>