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

Статус
Закрыто для дальнейших ответов.

Марат

New Member
Регистрация
17.02.2012
Сообщения
4
Ребята, помогите с 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>
 

Марат

New Member
Регистрация
17.02.2012
Сообщения
4
первый темплейт это //group в нем вызывать темплейт по @id = //site@groupid для сайтов.
http://xmlhack.ru/books/xslt/
http://raleigh.ru/XML/XSLTutorial/
p.s. Господа, я подаю идеи, код за вас я писать не буду, учитесь сами думать :)
Благодарю и за хорошие ссылки и за идею)
Просто вчера только тех.задание получил, а до этого про xslt вообще ничего не слышал)
 

Марат

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

<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>
 

Марат

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

Или как тогда обратиться к атрибуту одного шаблона, находясь внутри другого?
 
Статус
Закрыто для дальнейших ответов.
Верх Низ