我有一个 xslt 模板,我试图将我的项目的所有逻辑分段到不同的文件和模板中,这样一切都会很好而且整洁。顺便说一句,我正在使用微软的 xslt 处理器。
好吧,我遇到了这个问题,我在一个节点集的变量上调用应用模板,并且节点集成为根 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 中,但这仍然发生。
现在,如果我撤消模板并且只有一个 Key('',key('',key(''.....etc 的列表它将起作用,因为“/”仍然包含所有内容。但是当我应用模板时,有时候是这样的。
我看到了问题XSLT: Process an Xml node set in a template 同时仍然可以访问文档根目录,这是一种绕过它的方法。但我的问题更多的是为什么会发生这种情况以及它在 XSLT 2.0 中是如何处理的?(即使 MS 永远不会更新到 2.0)
我认为在 XSLT 2.0 中,结果树片段被取消了。是否还有类似对象的“结果树片段”,但它现在支持“/”操作等?还是一切都是节点集?