Перейти к содержимому

Фотография
- - - - -

XSLT-шаблон для перегонки XML в HTML


  • Вы не можете создать новую тему
  • Закрытая тема Тема закрыта
Сообщений в теме: 4

#1 Марат

Марат

    Прохожий

    Топикстартер
  • Участник
  • 0
    4 сообщ.

Отправлено 17 Февраль 2012 в 22:59

Ребята, помогите с XSLT-шаблоном, сам не могу допедрить какую конструкцию сочинить...

Вот содержание xml-документа:

<?xml version="1.0"?>
<document>
<sites>
<site gropuid="1">
<domain>ya.ru</domain>
<title>Яндекс</title>
</site>
<site gropuid="1">
<domain>rambler.ru</domain>
<title>Рамблер</title>
</site>
<site gropuid="1">
<domain>google.ru</domain>
<title>Google</title>
</site>
<site gropuid="1">
<domain>mail.ru</domain>
<title>M@il</title>
</site>
<site gropuid="2">
<domain>vk.com</domain>
<title>ВКонтакте</title>
</site>
<site gropuid="2">
<domain>facebook.com</domain>
<title>Facebook</title>
</site>
<site gropuid="2">
<domain>twitter.com</domain>
<title>Twitter</title>
</site>
</sites>
<groups>
<group id="1">
<title>Поисковые системы</title>
</group>
<group id="2">
<title>Социальные сети</title>
</group>
</groups>
</document>

На выходе надо получить вот такой вот HTML:

<html>
<head>
<title>Статистика сайтов</title>
</head>
<body>
<h1>Поисковые системы</h1>
<table>
<tr>
<td>ya.ru</td>
<td>Яндекс</td>
</tr>
<tr>
<td>rambler.ru</td>
<td>Рамблер</td>
</tr>
<tr>
<td>google.ru</td>
<td>Google</td>
</tr>
<tr>
<td>mail.ru</td>
<td>M@il</td>
</tr>


</table>

<h1>Социальные сети</h1>
<table>
<tr>
<td>vk.com</td>
<td>ВКонтакте</td>
</tr>
<tr>
<td>facebook.com</td>
<td>Facebook</td>
</tr>
<tr>
<td>twitter.com</td>
<td>Twitter</td>
</tr>

</table>
</body>
</html>

Сообщение отредактировал Creator: 17 Февраль 2012 в 23:23
Выделяйте код

  • 0

Спонсор

#2 Medwoodu

Medwoodu

    Злобный модер

  • суперМодератор
  • 357
    1 418 сообщ.

Отправлено 18 Февраль 2012 в 09:16

первый темплейт это //group в нем вызывать темплейт по @id = //site@groupid для сайтов.
http://xmlhack.ru/books/xslt/
http://raleigh.ru/XML/XSLTutorial/
p.s. Господа, я подаю идеи, код за вас я писать не буду, учитесь сами думать :)
  • 1

#3 Марат

Марат

    Прохожий

    Топикстартер
  • Участник
  • 0
    4 сообщ.

Отправлено 18 Февраль 2012 в 12:06

первый темплейт это //group в нем вызывать темплейт по @id = //site@groupid для сайтов.
http://xmlhack.ru/books/xslt/
http://raleigh.ru/XML/XSLTutorial/
p.s. Господа, я подаю идеи, код за вас я писать не буду, учитесь сами думать :)

Благодарю и за хорошие ссылки и за идею)
Просто вчера только тех.задание получил, а до этого про xslt вообще ничего не слышал)
  • 0

#4 Марат

Марат

    Прохожий

    Топикстартер
  • Участник
  • 0
    4 сообщ.

Отправлено 18 Февраль 2012 в 15:37

Шаблончик я написал, формирует все правильно. Может конечно решение в коде не слишком изящное, но работает.
Я хотел сделать более универсально, что то типа вот такой конструкции

<xsl:template match="group">
<h1>
<xsl:value-of select="title"/>
</h1>
<table>
<xsl:apply-templates select="//sites/site[@gropuid=//groups/group[@id]]"/>
</table>
</xsl:template>

, чтобы не загромождать код, если, например, айдишников будет не 2, а больше, но такая конструкция сработала неправильно.
Вот вариант, который работает правильно, но для каждого айдишника от группы нужно писать оператор <xsl:choose> и свой темплейт <xsl:template match="site[@gropuid=N]"> и так соответственно N раз..


<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
<xsl:apply-templates select="document"/>
</xsl:template>

<xsl:template match="document">
<xsl:apply-templates select="groups"/>
</xsl:template>

<xsl:template match="groups">
<xsl:apply-templates select="group"/>
</xsl:template>

<xsl:template match="group">
<h1>
<xsl:value-of select="title"/>
</h1>
<table>
<xsl:choose>
<xsl:when test="@id=1">
<xsl:apply-templates select="//sites/site[@gropuid=1]"/>
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="@id=2">
<xsl:apply-templates select="//sites/site[@gropuid=2]"/>
</xsl:when>
</xsl:choose>
</table>
</xsl:template>


<xsl:template match="site[@gropuid=1]">
<tr>
<td>
<xsl:value-of select="domain"/>
</td>
<td>
<xsl:value-of select="title"/>
</td>
</tr>
</xsl:template>


<xsl:template match="site[@gropuid=2]">
<tr>
<td>
<xsl:value-of select="domain"/>
</td>
<td>
<xsl:value-of select="title"/>
</td>
</tr>
</xsl:template>

</xsl:stylesheet>
  • 0

#5 Марат

Марат

    Прохожий

    Топикстартер
  • Участник
  • 0
    4 сообщ.

Отправлено 20 Февраль 2012 в 21:36

Ребят, не подскажите, почему вот это не работает?
<xsl:apply-templates select="//sites/site[@gropuid=//groups/group[@id]]"/>

Или как тогда обратиться к атрибуту одного шаблона, находясь внутри другого?
  • 0



Похожие темы Свернуть

Статистика

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых пользователей