如果我尝试以下解决方案,我会在所有子根标签中获取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)。
答案 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="">