.net 有条件地设置变量,不切割祖先轴
我在.NET下有xslt/XPathV1.0堆栈 我想有条件地设置变量$myVar:.net 有条件地设置变量,不切割祖先轴,.net,xslt,xpath,xslt-1.0,xpath-1.0,.net,Xslt,Xpath,Xslt 1.0,Xpath 1.0,我在.NET下有xslt/XPathV1.0堆栈 我想有条件地设置变量$myVar: <xsl:variable name="myVar"> <xsl:if test="$case ='1'"> <xsl:copy-of select="$otherVarA/down/the/rabbit/hole"/> </xsl:if> <xsl:if test="$case ='2'"> <xsl:co
<xsl:variable name="myVar">
<xsl:if test="$case ='1'">
<xsl:copy-of select="$otherVarA/down/the/rabbit/hole"/>
</xsl:if>
<xsl:if test="$case ='2'">
<xsl:copy-of select="$otherVarB/down/the/rabbit/hole"/>
</xsl:if>
<xsl:if test="$case ='3'">
<xsl:copy-of select="$otherVarC/down/the/rabbit/hole"/>
</xsl:if>
</xsl:variable>
稍后还有向下的访问:$myVar/go/deeper,但也有向上的访问,如so$myVar/祖先::rabbit
显然,这条路是向上的
如何设置$myVar以访问祖先轴
我知道您遇到的第一个问题是,在XSLT1.0中,当您在变量中使用xsl:copy of时,变量本身将是Result Tree Fragment类型,因此您将无法在其上使用诸如$myVar/down/to/rabbit/hole之类的xpath表达式。您需要使用节点集扩展函数将其从结果树片段转换为可以访问节点集的节点集,有关详细信息,请参见 然而,这并不能解决你的主要问题,关于获得祖先。因为您使用的是xsl:copy of,所以您将只能访问已复制的节点,而不能访问原始XML中未复制的任何节点的祖先 我怀疑你的真实情况可能更复杂,但根据你在问题中所展示的,你可以这样定义变量:
<xsl:variable name="myVar"
select="$otherVarA[$case ='1']/down/the/rabbit/hole
|$otherVarB[$case ='2']/down/the/rabbit/hole
|$otherVarC[$case ='3']/down/the/rabbit/hole"/>
这样,您现在引用的是原始XML中的节点,而不是复制,因此不需要节点集函数,并且祖先函数可以访问原始XML中的所有祖先
这确实假设$otherVarA/B/C变量是对原始XML的引用,而不是使用xsl:copy of创建的结果树片段
请参阅,以获取精心设计的示例。谢谢。我知道节点集。但它可能会帮助其他人。即使相应的$case条件为false,$otherVarABC vars也会被计算吗?XSLT/XPath规范很少说明是否计算某些内容,尤其是在1.0中,当逻辑上不需要计算时。优化完全取决于实现,不同的实现可能会有很大差异。在本例中,将对.Net和XSLT/XPath v1.0所有变量进行评估:我使用此代码进行测试。请参阅最后的输出。如果您关心性能,并且希望避免不必要的评估,则可以使用带参数的命名模板。另一个人为的例子请参见。谢谢。我想,对于这个命名模板解决方案,我需要知道$case/$c的实际值,祖先访问是在哪里完成的?如果是,那么您的解决方案与我当前的方法类似,这里没有显示。