В XSLT, как Вы тестируете, чтобы видеть, существует ли переменная?

Браузеры не всегда настраиваются для печати фоновых изображений по умолчанию; если Вы намереваетесь сделать, чтобы люди распечатали Вашу страницу :)

10
задан rjzii 19 August 2009 в 13:04
поделиться

6 ответов

Если рассматривать таблицу стилей 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>
20
ответ дан 3 December 2019 в 14:25
поделиться

На любом языке программирования вы будете вести себя точно так же.

Возьмите C #. Попытка сослаться на необъявленное имя переменной приводит к сообщению об ошибке. Это определенно ошибка программиста.

Почему необходимо, чтобы XSLT вел себя по-другому ?

Что касается размышлений о «до» и «позже», или о переменной, которая может иметь более одного значения, чтобы обозначать в какое «состояние» мы есть - все это не разрешено в XSLT по определению - и именно отсутствие таких «функций» делает XSLT красивым и элегантным функциональным языком, которым он является.

0
ответ дан 28 October 2019 в 03:40
поделиться

Переменные XSL имеют строго ограниченную область видимости, поэтому вы не можете получить к ним доступ в родственных узлах, только в дочерних. Если вы имеете дело с параметрами, вы можете использовать глобальный [1127983 provided.[12158 sizes] См.: http://www.stylusstudio.com/xsllist/199911/post30020.html

2
ответ дан 3 December 2019 в 14:25
поделиться

Ответ на этот вопрос означает, что вы не до конца поняли ключевой момент XSLT. : -)

Это декларативно: ничто не может существовать, пока вы этого не объявите. Вы объявляете переменную, и она есть, а вы - нет.

Ни разу не наступит момент, когда во время кодирования вам придется задаться вопросом, существует ли определенная переменная.

XSLT имеет строгие правила области видимости, переменные существуют только в рамках своего родительского элемента (а не всех элементов может содержать переменные для начала). Как только вы покидаете родительский элемент, переменная исчезает.

Так что, если вы не укажете свой вопрос / намерение еще раз, единственный правильный ответ - это неправильный вопрос. Вы не можете и не должны проверять, существует ли переменная во время выполнения.

12
ответ дан 3 December 2019 в 14:25
поделиться

Если у вас есть переменная, вы можете проверить, что в ней есть что-то или она «существует», выполнив что-то вроде следующего:

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

Что касается ее действительности, я не могу быть уверен. Однако я скажу вам, что я делаю это в некоторых наших системах на работе;)

0
ответ дан 3 December 2019 в 14:25
поделиться

Я не думаю, что это возможно, но вам вряд ли когда-нибудь понадобится, потому что переменная не существует, пока вы ее не объявили.

0
ответ дан 3 December 2019 в 14:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: