2011-01-24 24 views
0

我認爲這是一個初學者問題,它涉及跨不同XSLT模板的變量引用。結構是這樣的:關於鏈式XSLT中變量引用的問題

我首先有一個XSLT文件,其中我已經聲明瞭一個模板A,並且在它內部,我基本上遍歷了XML文件的每個記錄(行),例如xml_A ,並且我聲明瞭一個變量來引用xml_A中當前記錄的一個稱爲「id」的特定字段。然後,這個for-each循環中,我需要調用另一個模板B.

<xsl:template name="A"> 
<LoopA> 
    <xsl:for-each select="$xml_A//xml_A_row"> 
    <xsl:variable name="id_A" select="id"/> 
    .... 
</LoopA> 
<xsl:call-template name="B"/> 
</xsl:template> 

對於B模版,其實我創建的相同目錄下的另一個XSLT文件。該B包含數以百萬計的從XML文件「xml_B」的記錄,但我只希望有相同的ID字段作爲模板A的當前記錄的記錄,這是我如何做的:

<xsl:template name="B"> 
<LoopB> 
<xsl:variable name="id_A" select="id"/> 
... 
</loopB> 
</xsl:template>  

這纔是我的題。我用上面的<xsl:variable name="id_A" select="id"/>來指代上層循環所在的當前記錄的id字段。但是,我不確定這是否正確,我已經做了一些測試,因爲數據文件非常龐大,因此如果這樣做是正確的,就不容易進行視覺測試。

所以我想知道是否有人可以建議,如果上述引用外環變量是正確的,因爲如果我刪除它,XML編輯器會抱怨。

在此先感謝。

從評論

更新我覺得我沒有做它不夠清晰。 實際上xml_Axml_B都不是 即將被XSLTed的xml文件。 它們只是數據文件,我將 用於從中抽取數據,並且有 另一個XML文件C用於 應用樣式表,它是 爲空。所以在我的樣式表中,使用 提供的答案,我必須有辦法讓 使它參考這個數據存儲 文件xml_A。

+0

你的問題不清楚。這些`loopA`和`loopB`元素在樣式表片段中做了什麼? – 2011-01-24 15:58:26

+0

@Aljandro:LoopA和LoopB只是將在輸出xml中顯示的標籤。 – Kevin 2011-01-24 16:06:02

回答

4

典型的XSLT樣式是:

<xsl:variable name="xml_B" select="document('xml_B.xml')"> 

<xsl:template match="xml_A_row"> 
    <xsl:apply-templates select="$xml_B/path/to/xml_B_row[id = current()/id]"/> 
</xsl:template> 

注意:模式匹配,而不是xsl:for-each和命名模板的xsl:apply-templates代替xsl:call-templatecurrent()函數引用上下文節點。

編輯:爲了看起來更像你不完整的樣式表片段...

<xsl:key name="kBRowById" match="xml_B_row" use="id"/> 

<xsl:variable name="xml_A" select="document('xml_A.xml')"/> 
<xsl:variable name="xml_B" select="document('xml_B.xml')"/> 

<xsl:template name="A"> 
    <LoopA> 
     <xsl:for-each select="$xml_B"> 
      <xsl:apply-templates select="key('kBRowById',$xml_A//xml_A_row/id)" 
           mode="just-in-case"/> 
     </xsl:for-each> 
    </LoopA> 
</xsl:template> 

<xsl:template match="xml_B_row" mode="just-in-case"> 
    <LoopB/> 
</xsl:template> 

注意:使用xsl:key,因爲你寫了「記錄millons」,xsl:for-each,以便單根節點爲fn:key()函數更改上下文節點,使用最外面的作用域變量$xml_A作爲交叉引用鍵值。 mode是爲了防止與您沒有提供的樣式表中的其他規則衝突。