2010-04-02 79 views
2

鑑於XSLT:用作數字謂詞屬性值

<xsl:variable name="datePrecision" as="element()*"> 
    <p>Year</p> 
    <p>Month</p> 
    <p>Day</p> 
    <p>Time</p> 
    <p>Timestamp</p> 
</xsl:variable> 

表達

$datePrecision[5] 

返回包含值「時間戳」一個節點的節點集,如所預期。

在模板後來,隨着具有屬性

@precision="5" 

我試試下面的表達式,但都返回一個空字符串一個context元素:

$datePrecision[@precision] 
$datePrecision[number(@precision)] 
$datePrecision[xs:decimal(@precision)] 

但是,下面的序列做什麼,我想要

<xsl:variable name="prec" select="number(@precision)"/> 
... $datePrecision[$prec] ... 

使用Oxygen/XML的調試器我已經邁出了一步其中表達式是要進行評估,並顯示在監視窗口如下:

Expression       Value   Nodes/Values Set 
--------------------------   --------------- ----------------------- 
$datePrecision[5]     Node Set(1)  #text Timestamp 
@precision       Node Set(1)  precision 5 
$datePrecision[@precision] 
number(@precision)     5 
$datePrecision[number(@precision)] 
$prec        5 
$datePrecision[$prec]    Node Set(1)  #text Timestamp 

很顯然,我已經錯過了一些關於如何屬性節點在謂語使用原子化的根本,但找不到任何東西該文檔(邁克爾凱的XSLT/XPATH 2.0,第4版)可以解釋這種差異。

有人可以解釋爲什麼會發生這種情況,並指出我在哪裏,在XSLT 2.0規範或邁克爾凱的書中描述了這種情況?

(XSLT處理器是撒克遜PE 9.2.0.3)

+0

好問題(+1)。查看我的答案,解釋它並提供W3C XSLT規範所提供的解決方案。 :) – 2010-04-02 16:06:02

回答

1

顯然我錯過了什麼 根本

XPath表達式

$datePrecision[@precision] 

裝置:在$datePrecision具有名爲precision的屬性的所有元素。

但是您希望@precision表示與模板匹配的currnet節點的名爲precision的屬性。

XSLT提供current()函數正是爲此目的。使用

$datePrecision[current()/@precision] 

UPDATE:正如馬丁Honnen暗示,在OP可能希望得到的第5個元素出來$datePrecision - 這不是立即從問題的描述可見。在這種情況下,可能需要使用:

$datePrecision[position() = current()/@precision] 
+0

啊,是的,我明白了......在18個月的休息之後,我剛回到XSLT,顯然已經遠離了太久:-)感謝您的快速響應。 – 2010-04-02 16:47:53

+0

這仍然留下一個問題。 '$ datePrecision [number(@precision)]'中謂詞的含義是什麼? – 2010-04-02 16:49:54

+0

@ Jim-Garrison正如我在我的回答中所解釋的,如果節點集「$ datePrecision」中包含的任何元素具有名爲'precision'的屬性,並且它的值恰巧是數字並且它不是0,那麼這和所有這些)元素將被選中。爲了驗證這一點,使'$ datePrecision'中的某些元素具有'precision'屬性,其中包含不同的數字和非數字值,並查看錶達式選擇的內容。 – 2010-04-02 17:22:58