2013-08-30 126 views
1

我有一個xslt模板,我試圖將我的項目的所有邏輯分割成不同的文件和模板,所以一切都會很好,很整齊。我使用微軟xslt處理器btw。Xslt 1.0在變量節點集上應用模板更改根節點

嗯,我遇到了這個問題,我調用apply-template作爲節點集的變量,節點集成爲根節點xml節點。

<xsl:import href="tblLogins.xslt"/> 
<xsl:import href="tblPay_OrderItems.xslt/> 



      <xsl:variable name="item" select="/Entities/Data/tblLogins"/> 
      <!-- Get the users orders --> 
      <xsl:variable name="_orders" > 
       <xsl:apply-templates select="$item" mode="GetOrders" /> 
      </xsl:variable> 
      <xsl:variable name="orders" select="msxsl:node-set($_orders)/*" /> 
      <!-- Get the order's items --> 
      <!-- This works and we now have all the orders --> 
      <xsl:variable name="_orderItems" > 
       <xsl:apply-templates select="$orders" mode="GetOrderItems" /> 
      </xsl:variable> 
      <xsl:variable name="orderItems" select="msxsl:node-set($_orderItems)/*" /> 
      <!-- will always be empty --> 

tblLogins.xslt

<xsl:key name="ordersByUserId" match="tblPay_Orders" use="UserId" /> 

<xsl:template match="tblLogins" mode="GetOrders" > 
    <xsl:copy-of select="key('ordersByUserId',loginID)"/> 
</xsl:template> 

tblPay_Order.xslt

<xsl:key name="orderItemsByOrderId" match="tblPay_OrderItems" use="OrderId" /> 

<xsl:template match="tblPay_Orders" mode="GetOrderItems" > 
    <!-- "/" is now the tblPay_Orders and nothing else is available --> 
    <xsl:copy-of select="key('orderItemsByOrderId',Id)"/> 
    <!-- will return nothing --> 
</xsl:template> 

沒有模板

<!-- Works --> 
<xsl:copy-of select="key('orderItemsByOrderId',key('ordersByUserId',loginID)/Id)"/> 

編輯:我有它在不同的文件中設置了現在。我確實將所有文件都複製並粘貼到一個xslt中,但這仍然發生。現在,如果我撤消模板,只是有一個鍵列表('',鍵('',鍵(''.....等),它將工作,因爲「/」包含所有東西,但是當我應用模板,發生這種情況

我看到了XSLT: Process an Xml node set in a template while still having access to the document root這個問題,但我的問題更多的是爲什麼會發生這種情況,它是如何在XSLT 2.0中處理的?(即使MS將永遠不會更新到2.0)

我認爲,在XSLT 2.0結果樹片段已被廢除。是否仍然有一個「結果樹片段」像對象,但它現在支持「/」操作等?所有節點集?

回答

1

麻煩的是,在你的_orders變量節點是不能從輸入文檔的原始節點而新創建的副本這些節點的在結果樹片段中。 msxsl:node-set函數將此RTF轉換爲單個文檔根節點(以XPath數據模型術語 - 以DOM術語,它是文檔片段),並將複製的tblPay_Orders元素作爲子元素。

所以,當你apply-templates到這些節點你改變當前文檔這一片段,所以/則是指該片段節點而不是原來的文檔根目錄(更準確地說,是的/路徑指的根節點無論當前上下文節點屬於哪個文檔),並且key函數在片段中查找節點。

如果您使用相同的模板(XSLT 2.0將其稱爲「臨時樹」而不是RTF,但原理相同),您將在XSLT 2.0中遇到完全相同的問題 - copy-of仍會在臨時創建新節點樹。但是你可以使用xsl:sequence代替:

<xsl:template match="tblLogins" mode="GetOrders" > 
    <xsl:sequence select="key('ordersByUserId',loginID)"/> 
</xsl:template> 

的此不同的是,xsl:sequence返回附加到原始文檔,而不是在一個新的樹創建臨時複製原始節點。

+0

Arg。這是有道理的,但它仍然很糟糕,我不能按我想要的方式組織它。 – Buttink