Если $search_do
не определено, то оно не было объявлено (в текущей области).
Это так просто - в XSLT нет «определения условной переменной». Иногда их нельзя определить, а иногда нет, они всегда являются одним или другим. «Определенная проверка» совершенно не нужна, поэтому ее нет. Вы всегда можете увидеть из своего кода, есть ли переменная или нет.
Переменные строго ограничены. Действительны только в пределах их родительского элемента. Это означает, что вы не можете сделать
<xsl:if test="some-condition">
<xsl:variable name="search_do" value="foo" />
<!-- search_do goes out of scope right away! -->
</xsl:if>
<!-- $search_do will not be valid here -->
<input type="text" name="search_do" value="{$search_do}" />
а точнее
<xsl:if test="some-condition">
<xsl:variable name="search_do" value="foo" />
<!-- use it as long as it is in scope -->
<input type="text" name="search_do" value="{$search_do}" />
</xsl:if>