当使用XSLT你怎么测试是否本地范围的变量存在,或者是这甚至可能吗?
Answer 1:
考虑到XSLT样式表作为XML DOM,一个变量声明元素使变量可见的所有兄弟姐妹之后和他们的后裔。 这允许XSLT处理器静态分析包含可变参考,以查看是否该变量存在任何XPath; 如果在前同辈或祖先轴存在变量声明,可变基准是合法的,否则它不是。
请注意,这是完全依赖于XSLT,它是处理XML的不是结构的结构。 XSLT处理器可以如果XPath表达式使用不存在的变量,并应产生错误。
有没有办法来检查里面XSLT这种情况下,因为这种情况是不是XSLT中是合法的。 您在您的评论中所描述的sitauation - “我们的想法是设置一个标志变量,如果事情是输出,后来上显示不同的信息,如果没有什么是输出”。 - 其实应该导致一个语法错误。 举例来说,如果你做这样的事情:
<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>
你会得到一个语法错误:第二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>
Answer 2:
问这个问题说明你没有完全掌握XSLT的关键点。 :-)
它的声明:没有任何东西可以存在的,除非你声明它。 您声明一个变量,那么它的存在,你不这样做,那么它不是。
没有一次会不会有,你必须知道这一点,而编码,如果某个变量存在。
XSLT有严格范围规则,只有他们的父元素的范围内,存在的变量,(而不是所有的元素可以包含变量与开始)。 一旦你离开父元素,变量消失了。
所以,除非你指定你的问题/意图更多一些,唯一有效的回答是,这个问题是错误的。 你不能也不需要检查是否存在变量在运行时。
Answer 3:
XSL变量的作用域严格,所以你不能访问他们兄弟节点,只有孩子。 如果您正在处理使用参数,你可以使用一个全球性<xsl:param />
请参阅: http://www.stylusstudio.com/xsllist/199911/post30020.html
Answer 4:
我不认为这是可能的,但你不可能永远需要它,因为不存在的变量,除非你已经宣布它。
Answer 5:
如果你有一个变量,你可以检查它的东西,或者是“存在”做类似如下:
<xsl:choose>
<xsl:when test="$myvar">
This variable exists!
</xsl:when>
<xsl:otherwise>
The variable doesn't exist :(
</xsl:otherwise>
</xsl:choose>
至于它的有效性,我不能肯定。 我会告诉你,但是,我在我们的一些在工作系统的做到这一点;)
Answer 6:
最好的和快速的主意,检查walue如果它的存在,则检查它的长度
<xsl:if test="string-length(value/to/check)=0">
</xsl:if>
Answer 7:
在任何编程语言,你就会有完全一样的行为。
就拿C#。 试图在一个错误消息引用未声明的变量名的结果。 这是definetely一个程序员的错误。
为什么它会是必要的XSLT以不同的方式表现 ?
至于“之前”想和“后来”,或关于将为了表示有不止一个值的变量中,“状态”,我们 - 所有这一切没有在XSLT定义允许的 - 而正是没有这种“功能”是什么使XSLT的不错,ellegant函数式语言它是。