Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: XSL для вложенных структур  (Прочитано 12673 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« : 07-04-2010 10:00 » 

Такой вопрос. Есть мешанина данных типа:

Код:
      <paragraph>
        текст текст текст текст текст текст
      </paragraph>


      <paragraph>
        текст текст текст<product>ABC</product> текст текст текст текст текст
        текст <emphasis>Выделеный</emphasis> текст текст текст текст текст текст
        <list>
             <item>1</item>
             <item>2</item>
             <item>3</item>
        </list>
        текст текст текст текст текст текст
      </paragraph>


Должно получиться типа такого:

Цитата
текст текст текст текст текст текст

текст текст текст ABC текст текст текст текст текст текст Выделеный текст текст текст текст текст текст
    
  • 1
  • 2
  • 3
текст текст текст текст текст текст

Те в теге paragraph может быть просто текст, который надо отображать, а могут быть ещё другие вложенные структуры, которые в свою очередь также могут иметь подструктуры. Например, элемент списка может представлять собой несколько paragraph-оф или содержать другие списки. И тд и тп

Я сделал такие шаблоны для одиночных элементов:

Код:
  <xsl:template match="product" name="product_templ">
    <h3>
      <xsl:value-of select="."/>
    </h3>
  </xsl:template>

  <xsl:template match="emphasis" name="emphasis_templ">
    <b>
      <xsl:value-of select="."/>
    </b>
  </xsl:template>

  <xsl:template match="list">
    <ul>
      <xsl:for-each select="item">
        <li>
          <xsl:value-of select="."/>
        </li>
      </xsl:for-each>
    </ul>
  </xsl:template>

  <xsl:template match="paragraph">
    <p>
      <xsl:value-of select="."/>
    </p>
  </xsl:template>

А как строить шаблоны для сложных (вложеных) структур? Описывать правила для сложных структур (например для текста со списком и тд до умопомрачения, на все случаи жизни) или же можно использовать автоматом готовые шаблоны внутри друхих шаблонов типа "apply select=нужный шаблон"?

Число примитивных структур конечно и изначально известно, но их сложность и глубина вложенности могут быть произвольными. К примеру, генератор генерит абзац, который содержит список и в этом списке попадается название продукта.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 07-04-2010 19:30 » 

Например так:

Код:
<xsl:template match="paragraph">
  <p><xsl:apply-templates/></p>
</xsl:template>

Т.е. параграф может содержать внутри другие теги.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #2 : 07-04-2010 20:58 » 

Ну собственно говоря так и решил. Все примитивы (почти, где имело смысл) переделал таким образом. Интересно как это на время трансформации влияет. Хотя в моём случае "нас время не теснит" (с)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 08-04-2010 03:36 » 

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

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 08-04-2010 06:19 » new

Ага. Я просто XSLT вплотную занимаюсь второй день, поэтому подумал, что может есть какие другие решения.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 08-04-2010 07:12 » 

Жень, у тебя есть какие-то жесткие требования по быстродействию? Или обрабатываемый документ весит десятки-сотни мегабайт? Если нет, то можно не думать об этом.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 08-04-2010 09:56 » 

Аааа нет, мне быстродействие не нужно. Во всяком случае не на таком уровне.
Объём результата около 40 страниц А4.

Я тут уже цельный месяц на .NET 3.5 перехожу с его сокращёнными формами записи. Ну и в общем уже привычка вырабатывается что ли.

А тут, раз уж пришлось этим заниматься, просто праздное любопытство+нехватка времени на него. Чую чёт шеф недоброе задумал - чем я ща занимаюсь, всё дальше и дальше уходит от программирования: XML, XSL, CSS... Чем это всё закончится?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 08-04-2010 10:56 » 

Ром, такой вопрос, раз уж ты так активно отвечаешь Ага.

Короче сокращаю я ща количество шаблонов до минимума, благо формат исходного материала (XML) тоже мне подвластен. Трансформация в HTML осуществляется средствами CSS, посему я оставил в случае выделений только один тег с аттрибутом, а всё остальные search-replace-нул по такой схеме:

<product> заменил на <emphasis style="product">
<conditions> заменил на <emphasis style="conditions">
и тд

Ессно этим стилям соответствуют классы CSS и мой XSL шаблон выглядит оч. просто:

Код:
 <xsl:template match="emphasis[@style]">
    <span>
      <xsl:attribute name="class">
        <xsl:value-of select="@style"/>
      </xsl:attribute>
      <xsl:apply-templates/>
    </span>
  </xsl:template>

Но есть одна фишка - изначальный тэг <emphasis>. Те без аттрибута. Варианты:

1. Сделать ещё один шаблон для чистого emphasis. (не спортивно)
2. Проверять аттрибут внутри шаблона (не спортивно)
3. Методом XPath, которого я не знаю (а может его и нет), объяснить шаблону, что он должен работать с обеими тегами и использовать дефолтное значение. (чего очень хочется, но не знаю как и можно ли в принципе)
4. ?
« Последнее редактирование: 08-04-2010 11:00 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 08-04-2010 13:07 » 

Дома посмотрю - кажется что-то подобное (3) когда-то давно пробовал.
Кстати, а почему проверять - не спортивно?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 08-04-2010 13:49 » 

Ну в том плане, что это должно проверяться автоматом. Ведь принимается же решение какой элемент исходника подходит под этот шаблон, с параметром или без.

"неспортивно" = "зачем дублировать работу, которая и так делается".

Ром, да ты сильно не заморачивайся, не трать время. Эт я просто из интереса спрашиваю. Опыта у меня в этих делах ноль. А хочется надеяться, что всё так ррраз и готово. Ага

Меня уже другой задачей загрузили - переменным по условию контентом.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 08-04-2010 15:40 » 

Жень, варианты можно указать в одном шаблоне, разделив их "|".

Код:
<xsl:template match="ol|ul|li">
  <xsl:if test="name()='ol'"><OL>
    <xsl:if test="@type"><xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute></xsl:if>
    <xsl:if test="@start"><xsl:attribute name="start"><xsl:value-of select="@start"/></xsl:attribute></xsl:if>
    <xsl:apply-templates/>
  </OL></xsl:if>
  <xsl:if test="name()='ul'"><UL>
    <xsl:if test="@type"><xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute></xsl:if>
    <xsl:apply-templates/>
  </UL></xsl:if>
  <xsl:if test="name()='li'"><LI>
    <xsl:if test="@type"><xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute></xsl:if>
    <xsl:if test="@value"><xsl:attribute name="value"><xsl:value-of select="@value"/></xsl:attribute></xsl:if>
    <xsl:apply-templates/>
  </LI></xsl:if>
</xsl:template>
« Последнее редактирование: 08-04-2010 15:42 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 14-04-2010 07:40 » 

В первом (данном) случае пайп не пригодился, но зато пригодился в другом случае. Спасибо. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines