Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml Xslt 1.0在变量节点集上应用模板更改根节点_Xml_Xslt - Fatal编程技术网

Xml Xslt 1.0在变量节点集上应用模板更改根节点

Xml Xslt 1.0在变量节点集上应用模板更改根节点,xml,xslt,Xml,Xslt,我有一个xslt模板,我试图将我的项目的所有逻辑分割成不同的文件和模板,这样一切都会很好、整洁。顺便说一句,我正在使用Microsofts xslt处理器 我遇到了一个问题,在这个问题中,我对一个变量调用apply template,该变量是一个节点集,而该节点集变成了根xml节点 <xsl:import href="tblLogins.xslt"/> <xsl:import href="tblPay_OrderItems.xslt/> &l

我有一个xslt模板,我试图将我的项目的所有逻辑分割成不同的文件和模板,这样一切都会很好、整洁。顺便说一句,我正在使用Microsofts xslt处理器

我遇到了一个问题,在这个问题中,我对一个变量调用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中,但这种情况仍然存在

现在,如果我撤销模板,只需要一个Key、Key、Key…等的列表,它就会工作,因为/仍然包含所有内容。但当我应用模板时,就会发生这种情况

我看到了这个问题,这是一种回避问题的方法。但我的问题更多的是,为什么会发生这种情况,以及XSLT2.0如何处理这种情况?即使MS永远不会更新到2.0

我认为在XSLT2.0中,结果树片段被删除了。是否仍然存在类似结果树片段的对象,但它现在支持/操作等?或者所有内容都是一个节点集?

请阅读相关说明和说明

以及:


问题在于_orders变量中的节点不是输入文档中的原始节点,而是结果树片段中这些节点的新创建副本。在XPath数据模型术语中,msxsl:node set函数将此RTF转换为单个文档根节点——在DOM术语中,它是一个文档片段,其子元素是复制的tblPay_Orders元素

因此,当您将模板应用于这些节点时,您正在将当前文档更改为该片段,因此/然后更精确地引用片段节点而不是原始文档根,路径/引用当前上下文节点所属文档的根节点,并且键函数查找片段中的节点

如果您使用相同的模板XSLT2.0将其称为临时树而不是RTF,那么XSLT2.0中也会出现完全相同的问题,但原则是相同的-的副本仍然会在临时树中创建新节点。但您可以使用xsl:sequence:


这里的区别在于xsl:sequence返回附加到原始文档的原始节点,而不是在新树中创建临时副本。

Arg。这是有道理的,但它仍然很糟糕,我不能真正组织它的方式,我想。
<xsl:template match="tblLogins" mode="GetOrders" >
    <xsl:sequence select="key('ordersByUserId',loginID)"/>
</xsl:template>