вложенный for-each в XSLT
<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 только начал учить по необходимости, материалов нашел мало, поэтому в основном все делалось методом тыка)
Попробуй так: <xsl:for-each select="/data/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. может есть какая строковая функция которая поможет избавится от этой буквы?
Поможет substring-after().
снова благодарю
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>
циклы ваще не работают! подскажите плз!
[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]
хм, точно. спасибо большое!!!!