#xslt
#xslt
Вопрос:
В принципе, мне нужно открыть div в одном операторе if и закрыть его в другом. Я пытался
<xsl:value-of select="'<div>'"/>
но это не удалось, потому что < и > не разрешены в атрибутах. Есть идеи?
Приветствия
Комментарии:
1. Вы не можете просто написать
<div>
? Возможно, я чего-то недопонимаю…2. потому что это привело бы к несоответствующим и перекрывающимся тегам в xslt
3. Конечно. Извините, у меня тупой момент.
4. Вы написали
I need to open a div in one if statement and close it in another
. Вы ошибаетесь. Это императивный парадигмальный способ мышления. Вам нужно перефразировать этот вопрос как «Мне нужно обернуть некоторый шаблон содержимогоdiv
элементом в зависимости от некоторого условия»5. смотрите мой ответ о способе условного переноса некоторого содержимого с помощью
<div>
элемента, не нарушая XSLT.
Ответ №1:
Если то, что вы хотите сделать, это вывести некоторый контент независимо от какого-либо условия, но обернуть содержимое в <div>
в зависимости от условия:
<xsl:choose>
<xsl:when test="myConditionIsTrue">
<div>
<xsl:call-template name="bar"/>
</div>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="bar"/>
</xsl:otherwise>
</xsl:choose>
Вы можете изменить <xsl:call-template>
на <xsl:apply-templates>
или <xsl:value-of select="$myvariable" />
и т.д. В зависимости от того, каково неизменяемое содержимое.
Таким образом, вы будете рассматривать древовидную структуру как древовидную структуру, используя возможности древовидного процессора XML, вместо того чтобы пытаться бороться с ним. DOE может работать во многих случаях, но он не переносим, потому что процессоры XSLT не требуются для его выполнения. Действительно, они не могут, если только они не отвечают за сериализацию в определенном конвейере. Приведенный выше метод позволяет избежать этой проблемы.
Комментарии:
1. 1 за действительно хороший ответ. Если не OP, то кто-то другой может извлечь из этого урок.
2. 1 за хороший общий ответ. Кроме того, для некоторых преобразований вы могли бы вместо этого использовать математическую обработку шаблонов.
3. Спасибо за ваш вклад, я ценю, что мой метод не соответствует передовой практике, но я не могу использовать ваш метод, поскольку я использую рекурсивный шаблон для циклического создания нескольких разделов разной ширины и высоты, которые складываются в строки. Из-за ошибки Internet Explorer мне нужно было перенести все divs, созданные после определенной итерации, в содержащий div, что означает, что я должен открыть контейнер div на одной итерации шаблона и закрыть его на последней итерации. Возможно, есть более аккуратный способ сделать это, но это сработало.
Ответ №2:
Это работает:
<xsl:text disable-output-escaping="yes">amp;<divamp;></xsl:text>
Спасибо @Alejandro за подсказку в комментариях
Комментарии:
1. как сказал Майк, обычно это плохая практика.. вы должны знать, что это обычно указывает на путаницу разметки и текста. Смотрите dpawson.co.uk/xsl/sect2/N2215.html#d3702e223 Если вы расскажете нам подробнее о сценарии, мы, вероятно, сможем рассказать вам, как забивать винт отверткой вместо молотка!
Ответ №3:
Если вы просто распечатываете его, вы могли бы использовать html-объекты amp;<
и amp;>
вместо <
и >
.
Ответ №4:
Как правило, это плохая практика, поскольку вы всегда должны открывать и закрывать теги вашего вывода на одном уровне. В противном случае вы сталкиваетесь с потенциальным кошмаром «где я должен был это закрыть?» вопросы в будущем. Тем не менее, это может сработать:
<xsl:text disable-output-escaping="yes">amp;<divamp;></xsl:text>
(РЕДАКТИРОВАТЬ: забыл добавить экранирование вывода)
Комментарии:
1. А, ура. Еще не пробовал, но, похоже, это сработает
2. @Oliver: Это не работает. Для вывода искаженного дерева вам нужен DOE.
3. в итоге не сработало, я надеялся, что объекты будут преобразованы в фактический знак < и> в выходных данных