使用xslt仅将名称空间添加到根元素

时间:2016-09-30 02:19:08

标签: xml xslt

道歉。我见过很多类似的问题,但遗憾的是大多数问题对我不起作用。我的要求是 1)我必须使用XSLT仅为根元素添加命名空间 2)我正在使用xsl:result-document从单个输入生成多个XML文件。所有生成的doc的元素都应该具有命名空间。

如果我尝试以下解决方案,我会在所有子根标签中获取XMLNS。 如果我尝试xsl:copy,我会从输入XML中获取标签,因为我的输出标签与输入完全不同,所以我不想要它。

I / P:

<einfo>
    <employee>
        <eid>456</eid>
        <firstname>def</firstname>
        <lastname>y</lastname>
    </employee>
</einfo>

我的XSLT:

<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <!-- Global Variables -->
    <xsl:variable name="lcletters">abcdefghijklmnopqrstuvwxyz</xsl:variable>
    <xsl:variable name="ucletters">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
    <xsl:template match="einfo">
        <xsl:for-each select="employee">
            <xsl:variable name="docName" select="eid"/>
            <xsl:result-document href="{$docName}">
            <xsl:element name="employee" namespace="myurl">
            <xsl:call-template
                    name="processEmployees">
                <xsl:with-param name="p_firstname"
                                select="firstname"/>
                <xsl:with-param name="p_lastname"
                                select="lastname"/>
            </xsl:call-template>
            </xsl:element>
            </xsl:result-document>
        </xsl:for-each>
    </xsl:template>
    <xsl:template name="processEmployees">
        <xsl:param name="p_firstname"/>
        <xsl:param name="p_lastname"/>
        <xsl:element name="firstname">
            <xsl:value-of select="$p_firstname"/>
        </xsl:element>
        <xsl:element name="lastname">
            <xsl:value-of select="$p_lastname"/>
        </xsl:element>
    </xsl:template>
  </xsl:stylesheet>

实际输出:

<?xml version="1.0" encoding="UTF-8"?>
<employee xmlns="myurl">
   <firstname xmlns="">def</firstname>
   <lastname xmlns="">y</lastname>
</employee>

预期输出:我只需要根元素,即员工拥有命名空间(XMLNS)。

2 个答案:

答案 0 :(得分:0)

I just need name space for tag and not for all the other child tag.

您在命名空间节点和命名空间声明之间感到困惑。 xmlns =“”正被添加到子元素,因为在结果树中,子元素与父元素位于不同的命名空间中。如果您不想要xmlns =“”,则表明您实际上希望子项与父项位于同一名称空间中。您没有向我们展示processAdd模板,但有证据表明它在没有名称空间的情况下创建地址,而它应该在名称空间myurl中创建地址。

答案 1 :(得分:0)

为什么你不做:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/einfo">
    <xsl:for-each select="employee">
        <xsl:result-document href="{eid}">
            <employee xmlns="myurl">
                <firstname>
                    <xsl:value-of select="firstname" />
                </firstname>
                <lastname>
                    <xsl:value-of select="lastname" />
                </lastname>
            </employee>
        </xsl:result-document>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

注意:

乍一看,似乎有:

<firstname>
    <xsl:value-of select="firstname" />
</firstname>

可缩短为:

<xsl:copy-of select="firstname" />

然而,事实并非如此。样式表中的文字结果元素<firstname>继承其父<employee xmlns="myurl">的名称空间。写作:

<employee xmlns="myurl">
    <firstname>
        <xsl:value-of select="firstname" />
    </firstname>

与写作完全相同:

<employee xmlns="myurl">
    <firstname xmlns="myurl">
        <xsl:value-of select="firstname" />
    </firstname>

OTOH,如果您从源XML复制原始firstname元素,它将被复制到其原始名称空间(在本例中为无命名空间),并将在输出中显示为:

<firstname xmlns="">