xml - 默认命名空间未正确转换

标签 xml xslt namespaces xslt-2.0

我想向元素添加默认 namespace (变换时)。我使用 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>

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

任何人都可以解释一下为什么在子元素中创建 namespace ,即使我没有为此定义任何 namespace 以及如何避免此问题?

输入 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>

最佳答案

问题是,当您创建 UserAuthRequest 时,您没有为其指定命名空间

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

因此,XSLT 将生成一个没有命名空间的元素,即 xmlns=""。假设您的 ns 变量在范围内是全局的,只需按照与 School 元素相同的方式创建元素

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

实际上,如果您要匹配特定元素,则此处不需要local-name。这也可以工作

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

关于xml - 默认命名空间未正确转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15698039/

相关文章:

xml - xslt 问题(命名空间?)

php - 在 PHP 中将 MYSQL 表数据直接转换为 XML

xml - 在 XSL : How to avoid choose-blocks for wrapping elements? 中

java - 使用已编译的 XSL 转换

xml - 使用 XSLT 从 SOAP 到 XML

php - SplClassLoader 目录结构

java - 如何使用 XdmNode 从标签读取 namespace ?

php - 格式化发布的结果 - Youtube API

xml - 如果 XSLT 不存在,则附加页眉和页脚

xml - 如何从 XML 文档中删除命名空间?