2011-02-14 106 views
1

我在XSLT 1.0中建立無冗餘依賴關係時遇到問題。我有一個節點類型a,節點類型ba依賴於b - 如果我遇到a,並且沒有b已經存在,我應該插入一個。此外,我不應該改變任何其他情況。在xslt中建立依賴關係

輸入:

<variables> 
    <var Value="a"/> 
</variables> 

輸出:

<variables> 
    <var Value="a"/> 
    <var Value="b"/> 
</variables> 

我有困難的是,我不知道如何尋找ab相同的模板內。我可以搜索a,並用ab來代替它,但是當我們都在那裏時,我發現自己有冗餘。我可以搜索ab,並與一個b替換的第一個實例,但這時如果我只有b,我會包括一個沒有希望。我不知道如何搜索a,然後,如果我找到它,搜索同級節點b

+0

好問題,+1。請參閱我的答案,以獲得採用最基本的XSLT設計模式的完整,簡短且簡單的解決方案。也提供了廣泛的解釋。 :) – 2011-02-14 14:06:57

回答

4

這種轉變

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*" name="identity"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match= 
"var[@Value='a' and not(../var[@Value='b'])]"> 

    <xsl:call-template name="identity"/> 
    <var Value="b"/> 
</xsl:template> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<variables> 
    <var Value="a"/> 
</variables> 

產生想要的,正確的結果:

<variables> 
    <var Value="a"/> 
    <var Value="b"/> 
</variables> 

說明

  1. 身份規則/模板拷貝的每一個節點 「原樣」。使用和覆蓋身份規則是最基本和最強大的XSLT設計模式。

  2. 只有一個多個模板 - 重寫身份規則任何var元素,其Value屬性爲"a"不具有Value屬性與價值"b"同級var元素的值。該模板複製其匹配元素,然後根據需要創建一個新的var元素。

+0

不是「not(../ var [@ Value ='v'])」選擇相同的節點和屬性,因此將始終爲真? 認爲我們應該使用`not(next-sibling :: var [@ Value ='b'])「。這應該給我們所有節點帶一個A,沒有後面的B. – 2011-02-14 14:06:49