代码之家  ›  专栏  ›  技术社区  ›  rjzii

在XSLT中,如何测试变量是否存在?

  •  14
  • rjzii  · 技术社区  · 16 年前

    6 回复  |  直到 16 年前
        1
  •  20
  •   Robert Rossney    16 年前

    将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>
    

    你会得到一个语法错误:第二个 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>
    
        2
  •  12
  •   Tomalak    16 年前

    问这个问题表明您没有完全掌握XSLT的关键点。 :-)

    它是声明性的:除非你声明它,否则任何东西都不可能存在。你声明了一个变量,它就在那里,你没有,它就不在了。

    在编码时,你一次也不会怀疑某个变量是否存在。

    XSLT有严格的作用域规则,变量仅存在于其父元素的作用域内(并非所有元素都可以包含变量)。一旦你离开父元素,变量就消失了。

    并且不需要 检查运行时是否存在变量。

        3
  •  2
  •   Félix Saparelli    15 年前

    如果你正在处理参数,你可以使用全局 <xsl:param /> .

    请参阅: http://www.stylusstudio.com/xsllist/199911/post30020.html

        4
  •  1
  •   pevik Hudson    6 年前

    检查值是否存在的最佳快速方法是检查其长度

    <xsl:if test="string-length(value/to/check)=0">
    
    </xsl:if>
    
        5
  •  0
  •   Michael Krelin - hacker    16 年前

    我不认为这是可能的,但你不太可能需要它,因为除非你声明了变量,否则它就不存在。

        6
  •  -1
  •   rjzii    16 年前

    如果你有一个变量,你可以通过执行以下操作来检查它是否存在:

    <xsl:choose>
        <xsl:when test="$myvar">
            This variable exists!
        </xsl:when>
        <xsl:otherwise>
            The variable doesn't exist :(
        </xsl:otherwise>
    </xsl:choose>
    

    至于它的有效性,我不能肯定。但是,我会告诉你,我在我们的一些工作系统中这样做;)