2011-11-24 85 views
-1

我有XSLT將字符串文字

<xsl:for-each select="ancestor-or-self::*"> 
    <xsl:variable name="expression" select="name()" ></xsl:variable> 
</xsl:for-each> 

下面我有href和我要設置的值在這個HREF表達可變#######

<a href="/myplan?expression={$expression}" class="deleteIcon">Delete</a> 

我分配變量值也試過:

<a href="concat('/myplan?expression={',$expression)}" class="deleteIcon">Delete</a> 

他們都沒有工作。

Can有人可以幫我解決這個問題嗎?

基本上我的任務是找到當前節點的表達式併發送相同的表達式在href中?

添加更多的信息:

<br/><xsl:for-each select="ancestor-or-self::*"> 
       <xsl:variable name="expression" select="name()" /> 
      </xsl:for-each> 
     <b><a href="{concat('/admin/eapp/deleteQuestions?expression=',$expression)}"></a>Click Me</b> 

當上述XSL代碼被變換它給下面的錯誤:

Variable or parameter 'expression' is undefined. 
+2

當你說某件事不起作用時,總是準確地說出你做了什麼以及究竟是什麼效果。如果不知道症狀,我們無法診斷問題。不要只顯示不起作用的代碼:解釋你想要達到的目標。 –

+0

我刪除了我以前的答案,因爲新信息使其無關緊要。相反,它看起來像表達式包含所有祖先名稱的連接列表,但我不確定。你能發佈一個樣本輸入XML,也是你的預期輸出,所以毫無疑問?謝謝。 –

+0

我的要求是:我想將當前節點的路徑從根節點發送到服務器,以便我可以使用此路徑來刪除該節點。例如。從xml中刪除第三個分類的第五個分類。所以我正在做的是我迭代catagory和內部catagory有另一個迭代子subcatagorie。現在我想在這個子集合中找到節點的xpath。 –

回答

0

很簡單,變量是在XSL作用域和僅含有標記內存在。因此名爲expression的變量僅存在於for-each塊中。另外,變量只能設置一次。試圖第二次設置變量值不起作用。因此,您必須在要使用它的級別或更高級別聲明變量,並將所有代碼在變量聲明內部生成值。如果你可以使用XSLT2,下面會做你想要什麼:

string-join(for $n in ancestor-or-self::* return name($n), '/') 

我知道它也可以在XSLT 1用做遞歸模板,但是我沒有得心應手的例子。

1

在XSLT1.0,你可以嘗試設置變量,像這樣:

<xsl:variable name="expression"> 
    <xsl:for-each select="ancestor-or-self::*"> 
     <xsl:text>/</xsl:text> 
     <xsl:variable name="name" select="name()"/> 
     <xsl:value-of select="$name"/> 
    </xsl:for-each> 
    </xsl:variable> 

因此,假設下面的XML結構

<As> 
    <a> 
     <Bs> 
     <b>5</b> 
     </Bs> 
    </a> 
    <a> 
     <Bs> 
     <b>9</b> 
     </Bs> 
    </a> 
    <a/> 
    <a> 
     <Bs> 
     <b>12</b> 
     <b>14</b> 
     <b>15</b> 
     </Bs> 
    </a> 
</As> 

如果你是被定位爲與b元素值爲14,則表達式將被設置爲/As/a/Bs/b

但是,這不會考慮具有相同名稱的多個節點,因此,如果您想要精確的XPath來選擇節點,那麼這就不夠了。

相反,你可以嘗試以下方法:

<xsl:variable name="expression"> 
    <xsl:for-each select="ancestor-or-self::*"> 
     <xsl:text>/</xsl:text> 
     <xsl:variable name="name" select="name()"/> 
     <xsl:value-of select="$name"/> 
     <xsl:text>[</xsl:text> 
     <xsl:value-of select="count(preceding-sibling::*[name() = $name]) + 1"/> 
     <xsl:text>]</xsl:text> 
    </xsl:for-each> 
    </xsl:variable> 

這將返回/爲[1]/A [4]/BS [1]/B [2],這可能是你想。