Браузеры не всегда настраиваются для печати фоновых изображений по умолчанию; если Вы намереваетесь сделать, чтобы люди распечатали Вашу страницу :)
Если рассматривать таблицу стилей XSLT как XML DOM, элемент объявления переменной делает переменную видимой для всех последующих братьев и сестер и их потомков. Это позволяет процессорам XSLT статически анализировать любой XPath, содержащий ссылку на переменную, чтобы увидеть, существует ли переменная; если объявление переменной существует на оси предшествующего брата или предка, ссылка на переменную допустима, в противном случае - нет.
Обратите внимание, что это полностью зависит от структуры XSLT, а не от структуры XML, который он обрабатывает. Процессор XSLT может и должен выдать ошибку, если выражение XPath использует несуществующую переменную.
Невозможно проверить это условие внутри 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>
На любом языке программирования вы будете вести себя точно так же.
Возьмите C #. Попытка сослаться на необъявленное имя переменной приводит к сообщению об ошибке. Это определенно ошибка программиста.
Почему необходимо, чтобы XSLT вел себя по-другому ?
Что касается размышлений о «до» и «позже», или о переменной, которая может иметь более одного значения, чтобы обозначать в какое «состояние» мы есть - все это не разрешено в XSLT по определению - и именно отсутствие таких «функций» делает XSLT красивым и элегантным функциональным языком, которым он является.
Переменные XSL имеют строго ограниченную область видимости, поэтому вы не можете получить к ним доступ в родственных узлах, только в дочерних.
Если вы имеете дело с параметрами, вы можете использовать глобальный
Ответ на этот вопрос означает, что вы не до конца поняли ключевой момент XSLT. : -)
Это декларативно: ничто не может существовать, пока вы этого не объявите. Вы объявляете переменную, и она есть, а вы - нет.
Ни разу не наступит момент, когда во время кодирования вам придется задаться вопросом, существует ли определенная переменная.
XSLT имеет строгие правила области видимости, переменные существуют только в рамках своего родительского элемента (а не всех элементов может содержать переменные для начала). Как только вы покидаете родительский элемент, переменная исчезает.
Так что, если вы не укажете свой вопрос / намерение еще раз, единственный правильный ответ - это неправильный вопрос. Вы не можете и не должны проверять, существует ли переменная во время выполнения.
Если у вас есть переменная, вы можете проверить, что в ней есть что-то или она «существует», выполнив что-то вроде следующего:
<xsl:choose>
<xsl:when test="$myvar">
This variable exists!
</xsl:when>
<xsl:otherwise>
The variable doesn't exist :(
</xsl:otherwise>
</xsl:choose>
Что касается ее действительности, я не могу быть уверен. Однако я скажу вам, что я делаю это в некоторых наших системах на работе;)
Я не думаю, что это возможно, но вам вряд ли когда-нибудь понадобится, потому что переменная не существует, пока вы ее не объявили.