2010-09-02 69 views
1

我試圖使用單個XSLT文件插入唯一ID和對這些ID的引用。一次引用插入的元素

由於XML:

<Parent> 
    <Name>Dr Evil</Name> 
    <Child> 
    <Name>Scott Evil</Name> 
    </Child> 
</Parent> 

和身份後,該XSLT片斷轉換:

<xsl:template match="Parent"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:element name="UID"><xsl:value-of select="generate-id(.)"/></xsl:element> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Child"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:element name="UID"><xsl:value-of select="generate-id(.)"/></xsl:element> 
    <xsl:element name="ParentUID"><xsl:value-of select="../UID"/></xsl:element> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

我得到的輸出:

<Parent> 
    <UID>XYZ123</UID> 
    <Name>Dr Evil</Name> 
    <Child> 
    <UID>ABC789</UID> 
    <ParentUID/>    <-- expected <ParentUID>XYZ123</ParentUID> 
    <Name>Scott Evil</Name> 
    </Child> 
</Parent> 

換句話說,該UID元素當ParentUID元素被插入到子元素中時,插入到父元素中不可見。

我知道我可以使用兩遍(兩次變換),但我真的很想嘗試在一個文件中執行此操作。

+0

除了DevNull的正確答案,我看到你嘗試選擇從結果樹節點。請記住,這不會發生。 – 2010-09-02 13:16:24

回答

2

試試你的parentUID元素更改爲:

<xsl:element name="ParentUID"> 
    <xsl:value-of select="generate-id(parent::Parent)"/> 
    </xsl:element> 

您也可以刪除xsl:element

<ParentUID><xsl:value-of select="generate-id(parent::Parent)"/></ParentUID> 
+0

工作完美!我現在看到generate-id如何總是解析爲給定元素的相同ID。謝謝。 – Mykro 2010-09-02 05:28:07

+0

很好的答案(+1) – 2010-09-02 12:51:30

+0

不客氣的DJC。謝謝Dimitre! – 2010-09-02 17:27:12