2013-04-18 36 views
0

仍然使用XSLT進行調整。通過使用id轉換改變了我的解決方案,但無法離開,如何直接使用轉換後的項目(如果可能)XSLT執行標識轉換並使用轉換後的數據

源是兩個列表,它們將通過id轉換進行組合。 mapping-list將轉換後的xml中的項目導入到$ items變量中。

<mapping> 
    <sub id="1" item="a" group="a"> 
    <sub id="2" item="b" group="a"> 
    <sub id="3" item="d" group="b"> 
    <sub id="4" item="e" group="b"> 
    <sub id="5" item="f" group="c"> 
</mapping> 

<items> 
    <item id="a" val="OK"/> 
    <item id="b" val="ERROR"/> 
    <item id="c" val="OK"/> 
    <item id="d" val="OK"/> 
    <item id="e" val="OK"/> 
    <item id="f" val="OK"/> 
</items> 

使用id轉換,我將子節點更改爲NewItem節點,從第二個列表添加信息並添加所需的屬性。

<xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="sub"> 
    <xsl:element name="NewItem"> 
     <xsl:apply-templates select="@*"/> 
     <xsl:apply-templates select="$items/item[@id = ./@item]/@group"/> 
    </xsl:element> 
</xsl:template> 

但之後,似乎我無法對生成的NewItem節點做任何事情。使用模板,按類型選擇它們,什麼都不起作用,是否真的只能生成輸出,而不是進一步處理?

+0

似乎你沒有從你幾乎相同的問題的答案中學到任何東西 - 我懶得在這裏複製相同的答案 - 也複製相同的評論,解釋它的細節。通過閱讀一本好的XSLT書籍,可以更好地花費時間來了解該語言的基礎知識。 –

回答

1

使用xslt version = 1.0時,可以使用擴展名「not-set」。 讓新產生的內容的一個變量,並使用該

<xsl:apply-templates select="exsl:node-set($NewItem_var) /> 

要使它醒你必須添加以下行。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exsl="http://exslt.org/common" 
    extension-element-prefixes="exsl" 
    version="1.0"> 
1

使用XSLT 1.0,如果你創建一個節點包含可變它是一個結果樹片段,而你所要做的就是做xsl:copy-ofxsl:value-of。如果要進一步處理或選擇結果樹片段中的節點,則需要首先使用擴展功能,例如exsl:node-set。如果你有<xsl:variable name="items"><NewItems><xsl:apply-templates/></NewItems></xsl:variable>,你想模板應用到節點在結果樹片段需要

<xsl:apply-templates select="exsl:node-set($items)/NewItems/NewItem"/> 

凡在你的樣式表綁定xmlns:exsl="http://exslt.org/common"。但是請注意,對於便攜式樣式表,您可能需要檢查XSLT處理器的文檔是否支持EXSLT命名空間中的node-set函數或不同的函數(如MSXML),在這種情況下,您需要檢查function-available哪些函數是支持並編寫xsl:choose檢查以確保在apply-templates中使用支持的功能。

如果您可以移動到XSLT 2.0處理器,您會發現限制已經消失,您可以在XSLT 2.0中像使用主輸入樹一樣使用任何臨時樹,而無需使用擴展功能。