2012-01-01 50 views
-1

使用XSLT 1.0,我想按照A,B,C,D的順序處理四個節點集。但是我不能用一個單個(或至少不可管理的)XPath表達式。爲我正在處理的樹中的一個節點分配一個值

我想先把所有節點都標記爲A,將所有節點都標記爲B等等,然後就可以隨意選擇所有A節點,所有B節點等。

我也可能想在稍後添加到列表中。

我無法在正在處理的文件中創建屬性。 (對嗎?)變量過早超出範圍。也許使用鍵的東西?所有A的關鍵,全是B?但是,一旦創建密鑰,我可以將更多節點添加到密鑰表中嗎?

或者有沒有辦法保存XPath?

有沒有一種簡單的方法來做到這一點,或者我每次想選擇每個節點集時,是否必須創建一個討厭,糟糕,容易出錯,可怕的Xpath表達式?

+1

似乎過於籠統 - - 您是否希望學習所有XPath和XSLT作爲單個問題的答案?如果是這樣,最好的答案是:獲取並閱讀一本關於XSLT/XPath的好書。這裏是一些最好的資源的鏈接:http://stackoverflow.com/questions/339930/any-good-xslt-tutorial-book-blog-site-online/341589#341589 – 2012-01-01 06:09:24

+1

你想在一個方面程序性的解決方案,而且你會感到沮喪,因爲XSLT是一種聲明性語言,並且不允許程序性解決方案。如果您試圖向我們解釋您正在嘗試解決的問題(而不是解決問題的程序方法),那麼我們可能會幫助您。 – 2012-01-01 13:58:48

+0

謝謝邁克爾。在客戶端轉換中,我按順序處理四個節點集,每個節點集都由複雜的XPath表達式定義。我需要在渲染HTML的同時多次處理這四套。每次我需要處理四組時,如何避免在XSL中重複使用XPath表達式? – JPM 2012-01-01 15:21:39

回答

0

解決方案:使用全局變量,像這樣:

<xsl:variable name="A" select="//tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:title" /> 
<xsl:variable name="B" select="//tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:author" /> 
<xsl:variable name="C" select="//tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:sponsor | 
           //tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:funder  | 
           //tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:principal | 
           //tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:respStmt | 
           //tei:teiHeader/tei:fileDesc/tei:editionStmt    | 
           //tei:teiHeader/tei:fileDesc/tei:extent     | 
           //tei:teiHeader/tei:fileDesc/tei:seriesStmt" /> 
<xsl:variable name="D" select="//tei:teiHeader/tei:fileDesc/tei:notesStmt/tei:note" /> 

再後來:

<xsl:call-template name="writeMetadata"> 
    <xsl:with-param name="rowitems" select="$A" /> 
</xsl:call-template> 
<xsl:call-template name="writeMetadata"> 
    <xsl:with-param name="rowitems" select="$B" /> 
</xsl:call-template> 
<xsl:call-template name="writeMetadata"> 
    <xsl:with-param name="rowitems" select="$C" /> 
</xsl:call-template> 
<xsl:call-template name="writeMetadata"> 
    <xsl:with-param name="rowitems" select="$D" /> 
</xsl:call-template> 

經常需要重複,而無需重複XPath表達式。

(邁克爾,您的評論「人們往往沒有意識到,全局變量的定義可以參考源文件」,張貼在dpawson.co.uk,讓我看在右側區域)。

+0

或者添加一個密鑰,該密鑰也是全局的,可以通過XPath查詢設置到樹中。一個例子是在這裏:http://stackoverflow.com/questions/8703217。 – JPM 2012-01-11 17:51:29

相關問題