2014-04-03 81 views
3

我需要從輸入中爲固定數量的語言生成XML結構,該輸入可能包含或不包含每種語言的信息。如果信息丟失,我需要生成空的元素。問題是,我需要在輸出結構中的許多地方迭代語言。xslt-1.0迭代固定值列表

最簡單的方法是使用類似的東西

<xsl:variable name="languages" select="en,de,fr"> 
<xsl:for-each select="$languages"> 
... 
</xsl:for-each> 

與出現的地方我需要的語言列表中的循環。

當然這不起作用,因爲select="en,de,fr"沒有定義節點列表。有了擴展,我可以使用node-set函數,但我堅持使用XSLT-1.0。

有沒有什麼辦法來定義一個恆定的節點集來迭代?

(這在某種程度上與another question那裏接受的答案殺死創建一個常數節點集的很多想法,在需要的<xsl:variable/>子元素特定一切)

回答

2

如果你想有一個不斷節點設置,而不止一個,其內容是由xsl:指令來計算,那麼你可以做document('')一招,讓你接觸到樣式表本身的XML樹:

<xsl:variable name="languagesLiteral"> 
    <lang>en</lang> 
    <lang>de</lang> 
    <lang>fr</lang> 
</xsl:variable> 

<xsl:variable name="languages" 
    select="document('')//xsl:variable[@name='languagesLiteral']/*" /> 

這隻能對於靜態值,如果您有例如<xsl:variable name="foo"><xsl:for-each ...>那麼您從document('')技巧中得到的節點集合將是xsl:for-each元素,而不是評估它的結果。

+0

幸運的是,在我的用例中只需要靜態值。 – Harald

+1

那麼,在此期間,我學到了一個醜陋的副作用:當我循環使用$語言時,在循環中我似乎無法再訪問原始文檔。一個''不會返回任何結果:-(任何想法如何解決這個問題? – Harald

+1

@Harald你必須將它存儲在一個變量中''。自己的意思是當前文檔的根目錄,並且在for語言中的每一個上面,這意味着樣式表('document('')')。 –