我在.NET下有xslt/xpath v1.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: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
,但也有像这样的向上访问$myVar/ancestor::rabbit
。
显然
<xsl:copy-of select="$myVar/down/to/rabbit/hole"/>
切断了向上的路径。
如何设置
$myVar
方式才能访问祖先轴?
我知道
<xsl:variable name=... select=...
不会切割向上的轴。
您遇到的第一个问题是,在 XSLT 1.0 中,当您在变量中使用
xsl:copy-of
时,变量本身将是“结果树片段”类型,因此您将无法使用像 这样的 xpath 表达式$myVar/down/to/rabbit/hole
就可以了。您需要使用“节点集”扩展函数将其从结果树片段转换为可以访问其中节点的节点集(请参阅https://www.xml.com/pub/a/ 2003/07/16/nodeset.html 了解更多详情)。
但是,这并不能解决你关于获取祖先的主要问题。因为您使用的是
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
创建的结果树片段。
请参阅 http://xsltfiddle.liberty-development.net/bwdwrw 了解人为示例。