Как я могу напечатать один , не закрывая его в XSLT

#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. в итоге не сработало, я надеялся, что объекты будут преобразованы в фактический знак < и> в выходных данных