2012-04-06 78 views

回答

0
<xsl:if test=".[foo or @bar]">  
    something 
</xsl:if> 

在XSLT 1.0這在語法上是無效的,併產生一個錯誤

在XSLT 2.0這相當於

<xsl:if test="foo or @bar">  
    something 
</xsl:if> 

表達

foo or @bar 

評估爲true()恰好當上下文節點(當前節點)具有子元素命名foo上下文節點具有名爲bar(或兩者)的屬性。

否則該表達式評估爲false()

因此,上面的代碼段是指:如果這兩個條件之一爲真:當前節點有一個名爲foo子元素,或者當前節點具有屬性命名bar - 然後輸出字符串「東西」

+0

XSLT 2.0,所以這就是瀏覽器之間存在不一致的原因。非常感謝。 – gfaceless 2012-04-06 12:46:08

+0

@gfaceless:*目前所有*瀏覽器僅使用XSLT 1.0。也許IE6的XSLT處理器有一個bug。無論如何,所有人都應該接受'foo或@ bar' - 這是您可以進行的校正以確保x瀏覽器的行爲。順便說一句,你可以*接受*最有用的答案,通過點擊旁邊的複選標記:) – 2012-04-06 13:06:34

+0

我不知道,並檢查標記:) – gfaceless 2012-04-06 13:11:37

0

它測試當前節點是否有一個名爲foo子元素或有一個名爲bar的屬性。也就是說,如果將其更改爲

<xsl:if test="foo or @bar"> 

您使用我的XSL解析器被拒絕的語法:Invalid XPath expression Unexpected token - "[foo or @bar]"

我使用的一個應該工作的跨瀏覽器。
如果您想選擇具有名稱foobar屬性節點,然後使用以下命令:

<xsl:if test="name()='foo' or @bar"> 
+0

我認爲這是一個錯誤,但IE6是'強'足以忽略這一點。感謝您的詳細澄清。 – gfaceless 2012-04-06 12:10:29

2

在XSLT 1.0中不允許使用語法.[x]。在XSLT 1.0的早期草案中允許使用它,並且我懷疑它是由於疏忽而不是作爲故意設計決定而產生的最終版本(並且如已經指出的那樣,它已在XSLT 2.0中恢復)。由於IE在1.0規範定稿之前首次發佈了它的XSLT處理器,因此它們可能支持這種語法,以便與這些早期版本的草稿向後兼容。

+0

所以這就是歷史。 – gfaceless 2012-04-07 08:39:01