Rob*_*ney 20
将XSLT样式表视为XML DOM,变量声明元素使变量对所有后续兄弟及其后代可见.这允许XSLT处理器静态分析包含变量引用的任何XPath,以查看变量是否存在; 如果变量声明存在于前一个兄弟或祖先轴上,则变量引用是合法的,否则不是.
请注意,这完全取决于XSLT的结构,而不是它正在处理的XML的结构.如果XPath表达式使用不存在的变量,XSLT处理器可以而且应该产生错误.
在XSLT中无法检查这种情况,因为这种情况在XSLT中是不合法的.您在评论中描述的静音 - "想法是设置一个标志变量,如果输出某些内容,稍后如果没有输出则显示不同的消息." - 实际上应该导致语法错误.例如,如果您执行以下操作:
<xsl:if test="some_condition">
<!-- produce output here -->
<xsl:variable name="flag">true</xsl:variable>
</xsl:if>
<!-- time passes -->
<xsl:if test="$flag='true'>
<!-- wouldn't it be nice? -->
</xsl:if>
Run Code Online (Sandbox Code Playgroud)
你会得到一个语法错误:第二个xsl:if元素既不是变量声明的后续兄弟,也不是它们的后代之一.
这是一种我使用相当数量的技术 - 这会根据您不想在以后重新检查的各种不同条件生成可变输出:
<xsl:variable name="output">
<xsl:if test="$condition1='true'">
<p>condition1 is true</p>
</xsl:if>
<xsl:if test="$condition2='true'">
<p>condition2 is true</p>
</xsl:if>
<xsl:if test="$condition3='true'">
<p>condition3 is true</p>
</xsl:if>
</xsl:variable>
<!-- we've produced the output, now let's actually *output* the output -->
<xsl:copy-of select="$output"/>
<!-- time passes -->
<xsl:if test="normalize-space($output) != ''">
<p>This only gets emitted if $output got set to some non-empty value.</p>
</xsl:if>
Run Code Online (Sandbox Code Playgroud)
Tom*_*lak 12
提出这个问题表明你没有完全掌握XSLT的关键点.:-)
它是声明性的:除非你声明它,否则什么都不存在.你声明一个变量,然后它就在那里,你没有,那就不是.
如果存在某个变量,那么在编码时你不得不怀疑这一点.
XSLT具有严格的范围规则,变量仅存在于其父元素的范围内(并且并非所有元素都可以包含要开始的变量).离开父元素后,变量就消失了.
因此,除非您再详细说明您的问题/意图,唯一有效的答案是问题是错误的.您不能也不需要在运行时检查变量是否存在.