Apologies.I看到了很多類似的問題,但不幸的是,其中大多數不適用於我。我的要求是 1)我必須使用XSLT爲根元素添加命名空間 2)我使用xsl:result-document從單個輸入生成多個XML文件。所有生成的文檔的根元素應該具有名稱空間。使用xslt將名稱空間僅添加到根元素
如果我嘗試以下解決方案,我會在我的所有子級別標記中獲得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 )。
請張貼** **再現的例子,包括一個輸入端和一個** **完整(優選最小化)的樣式表 - 見:[MCVE]。 - 一般來說,你誤解了命名空間是如何工作的。默認的名稱空間是繼承的。如果您不希望'address'具有現在的重載無名稱空間聲明,則必須將它放在與其父'home'相同的名稱空間中。對於結果樹中的所有其他元素也是如此。 –