有条件地设置变量而不切割祖先轴

问题描述 投票:0回答:1

我在.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=... 
不会切割向上的轴。

.net xslt xpath xslt-1.0 xpath-1.0
1个回答
1
投票

您遇到的第一个问题是,在 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 了解人为示例。

© www.soinside.com 2019 - 2024. All rights reserved.