2014-05-19 161 views
2

我正在將一個XML轉換爲另一個。 比方說,我們從看在我的轉換XML這樣開始XSLT:使用另一個屬性的值創建新屬性

<fruit id="123"> 
    <apple></apple> 
    <banana></banana> 
    <lemon></lemon> 
</fruit> 

現在XML我想創建一個id屬性從我的舊XML值的新屬性。

我試圖做到這一點是這樣的:

<xsl:template match="fruit"> 
    <xsl:attribute name="reference"> 
     <xsl:value-of select="fruit/@id"/> 
    </xsl:attribute> 
</xsl:template> 

我得到這個錯誤:

cannot create an attribute node whose parent is a document node 

有人可以給我解釋一下我做錯了,因爲我不明白錯誤。 解決方案會很好。

謝謝!

回答

3

問題是文檔節點不能有屬性,並且您沒有在要應用的屬性的輸出樹中創建元素。文檔節點還必須具有單個元素子元素。

像下面這樣的東西應該工作。

<xsl:template match="fruit"> 
    <fruit> 
     <xsl:attribute name="reference"> 
      <xsl:value-of select="@id"/> 
     </xsl:attribute> 
    </fruit> 
</xsl:template> 
+3

在匹配'fruit'的模板中,您需要使用''來選擇並輸出匹配元素的id屬性的值。 –

+0

@MartinHonnen謝謝,我粘貼時沒有發現錯誤。我現在修好了。 –

1

錯誤消息告訴你,你不能在這裏創建一個屬性節點,因爲它沒有它屬於的元素。屬性節點只能在元素內部(在輸出意義上)內創建,您尚未在該元素下創建任何子節點(元素,文本節點,註釋或處理指令)。

從這個

除此之外,您的XPath是錯誤的 - 你是fruit元件匹配模板內,所以路徑id屬性僅僅是@id,不fruit/@id

+0

這是否意味着您無法將新屬性添加到文檔元素? – Tcanarchy

+1

@Tcanarchy _document node_不是一個元素。在XPath數據模型中,文檔節點是一種形成整個樹根的虛擬節點。文檔節點必須只有一個元素子元素(_document元素_),但它可以在單個元素之前或之後(例如,在文檔元素的開始標籤之上的註釋)附加地具有註釋,處理指令或僅含空白的文本節點。您可以將屬性添加到文檔元素,但不能添加到根文檔節點。 –

相關問題