Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

вложенный for-each в XSLT

2.0K
07 ноября 2006 года
A.D.I.D.A.S
52 / / 23.11.2004
есть XML-документ примерно следующего вида

<data>
<sector id="s1">Sector 1</sector>
<sector id="s2">Sector 2</sector>
<sector id="s3">Sector 3</sector>

<subsector id="u1">Subsector 1</subsector>
<subsector id="u2">Subsector 2</subsector>
<subsector id="u3">Subsector 3</subsector>
<subsector id="u4">Subsector 4</subsector>
<subsector id="u5">Subsector 5</subsector>
</data>

необходимо сделать чтобы выводилось все в примерно так:
Sector1
Subsector 1
Subsector 2
Subsector 3
Subsector 4
Subsector 5
Sector2
Subsector 1
Subsector 2
Subsector 3
Subsector 4
Subsector 5
... и т.д.

делал вот так:

<?xml version="1.0" encoding="iso-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="data/sector">
<xsl:sort order="ascending" select="@id"/>
<xsl:value-of select="."/>
<xsl:for-each select="data/subsector">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

но внутренний for-each не работает. так и должно быть, или я что-то не так делаю?
XSLT только начал учить по необходимости, материалов нашел мало, поэтому в основном все делалось методом тыка)
337
07 ноября 2006 года
shine
719 / / 09.06.2006
Попробуй так: <xsl:for-each select="/data/subsector">
2.0K
07 ноября 2006 года
A.D.I.D.A.S
52 / / 23.11.2004
спасибо, заработало
2.0K
08 ноября 2006 года
A.D.I.D.A.S
52 / / 23.11.2004
<subsector id="u1">Subsector 1</subsector>
<subsector id="u2">Subsector 2</subsector>
<subsector id="u3">Subsector 3</subsector>
<subsector id="u4">Subsector 4</subsector>
<subsector id="u5">Subsector 5</subsector>

еще вопрос: как отсортировать это по атрибуту id? тоесть мне нужна численная сортировка, но при преобразовании функцией number() например "u2" из-за первой u результат NaN. может есть какая строковая функция которая поможет избавится от этой буквы?
337
08 ноября 2006 года
shine
719 / / 09.06.2006
Поможет substring-after().
2.0K
09 ноября 2006 года
A.D.I.D.A.S
52 / / 23.11.2004
снова благодарю
64K
27 сентября 2010 года
Arisha
2 / / 27.09.2010
У меня похожая ситуация
xml документ:
<menu>
<item id="1" level="1">
<name>item1</name>
</item>
<item id="2" level="2">
<name>item2</name>
</item>
<item id="3" level="2">
<name>item3</name>
</item>
<item id="4" level="1">
<name>item4</name>
</item>
<item id="5" level="2">
<name>item5</name>
</item>
<item id="6" level="2">
<name>item6</name>
</item>
<item id="7" level="3">
<name>item7</name>
</item>
</menu>


порядок следования узлов жестко задается (id строго по возрастанию)
level - уровень вложенности, которую надо показать
на основе этих данных нужно получить следующий XML, где
узлы будут вложены согласно порядку их следования и уровню.

<menu>
<item id="1">
<name>item1</name>
<item id="2">
<name>item2</name>
</item>
<item id="3">
<name>item3</name>
</item>
</item>
<item id="4">
<name>item4</name>
<item id="5">
<name>item5</name>
</item>
<item id="6">
<name>item6</name>
<item id="7">
<name>item7</name>
</item>
</item>
</item>
</menu>

делаю так:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl: output method="xml"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>

<xsl:for-each select="menu/item">
<xsl:sort order="ascending" select="@id"/>
<xsl:value-of select="."/>
<xsl:for-each select="menu/item">
<xsl:sort order="ascending" select="@level"/>
</xsl:for-each>
</xsl:for-each>

</xsl:template>

</xsl:stylesheet>


циклы ваще не работают! подскажите плз!
62K
30 сентября 2010 года
moto
8 / / 20.08.2010
Ну хотя бы так:

[HTML]<?xml version="1.0" encoding="UTF-8"?>

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

<xsl:template match="/">
<menu>
<xsl:apply-templates select="menu/item[@level=1]"/>
</menu>
</xsl:template>

<xsl:template match="item">
<item id="{@id}">
<name><xsl:value-of select="name"/></name>

<xsl:if test="following-sibling::item[1]/@level > @level">
<xsl:apply-templates select="following-sibling::item[1]"/>
</xsl:if>
</item>

<xsl:if test="following-sibling::item[1]/@level = @level or ../item[@level=@level+1]">
<xsl:apply-templates select="following-sibling::item[1]|../item[@level=@level+1]"/>
</xsl:if>
</xsl:template>

</xsl:stylesheet>[/HTML]
64K
03 октября 2010 года
Arisha
2 / / 27.09.2010
хм, точно. спасибо большое!!!!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог