2015-04-14 67 views
0

我有以下樹形文件結構:獲取文件的路徑 - XSLT

ROOT (ID 0000) 
- FILE 1 (ID 0001) 
- FILE 2 (ID 0002) 
- - FILE 2.1 (ID 0003) 
- - FILE 2.2 (ID 0004) 
- - - FILE 2.2.1 (ID 0005) 
- FILE 3 (ID 0006) 

所有這些都具有以下結構的XML文件:

<asset id="0002" name="FILE 2"> 
    <child_asset_rel child_asset="0003"/> 
    <child_asset_rel child_asset="0004"/> 
</asset> 

這樣,元素<child_asset_rel>只要主要元素有孩子就會出現。我們還可以看到,在XML中,我們只能檢測資產的「直接子女」,即每個文件不知道它是否有孫子,所以我們必須在每個文件中查找子女。

輸入是根文件的XML。這是因爲如下:

<asset id="0000" name="ROOT"> 
    <child_asset_rel child_asset="0001"/> 
    <child_asset_rel child_asset="0002"/> 
    <child_asset_rel child_asset="0006"/> 
</asset> 

另外我有一個功能get-asset('ID')返回資產的XML文件,我們傳遞的參數的ID。

例如:get-asset(0002)將返回上面的XML示例。

我要的是讓出如下的完整路徑資產名稱的列表:

<file href="FILE 1"/> 
<file href="FILE 2/FILE 2.1"/> 
<file href="FILE 2/FILE 2.2/FILE 2.2.1"/> 
<file href="FILE 3"/> 

正如你可以在上面的例子中看到,根元素一定不能包含在路徑。

我已經嘗試了很多解決方案,但我似乎無法獲得我想要的結果。我嘗試在遞歸函數中使用for-each,但結果不是預期的結果。

+0

您使用的是哪個版本的XSLT,您能向我們展示函數get-asset的代碼嗎?這是一個擴展函數還是一個XSLT函數?什麼是樣式表的輸入,一個資產ID? –

+0

XSLT的版本是2.0,很抱歉,由於許可原因,我無法向您顯示「獲取資產」功能的代碼。這些函數只接收一個ID並用該ID返回該文件的XML。樣式表的輸入是XML,它是我上面提到的所有結構的根。我編輯條目以澄清輸入問題。 –

+0

爲什麼輸入XML不包含''儘管在問題開始處給出的結構顯示'FILE 1(ID 0001)'。 –

回答

0

這裏是模板輪廓:

<xsl:template match="asset[@name = 'ROOT']" priority="5"> 
    <xsl:apply-templates select="child_asset_rel/get-asset(@child_asset)"> 
    <xsl:with-param name="path" select="''"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="asset[child_asset_rel]"> 
    <xsl:param name="path" select="concat($path, @name, '/')"/> 
    <xsl:apply-templates select="child_asset_rel/get-asset(@child_asset)"> 
    <xsl:with-param name="path" select="$path"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="asset[not(child_asset_rel)]"> 
    <xsl:param name="path"/> 
    <file href="{$path}{@name}"/> 
</xsl:template> 

未經檢驗的,你沒有提供的樣本數據和示例代碼來測試,但應該給你一個想法。

+0

我改變了一行。第二個應用模板的值,它表示:從'到'' –