@olijen

Как пройтись циклом по не вложенной структурк XML?

Как в XSL поочередно вывести такой набор тегов через цикл? Тегов может быть неограниченное количество.
<main>
  <tag ROWNUM="1">Олег</tag>
  <tag ROWNUM="2">Виктор</tag>
  <tag ROWNUM="3">Денис</tag>
  <tag ROWNUM="4">Кирилл</tag>
  <tag ROWNUM="1">Олегович</tag>
  <tag ROWNUM="2">Викторович</tag>
  <tag ROWNUM="3">Денисович3</tag>
  <tag ROWNUM="4">Кириллович</tag>
</main>

Чтоб было "Олег Олегович, Виктор Викторович, Денис Денисович"...?
Раньше была вложенная структура и разбирал через for-each. Теперь признак группы в ROWNUM и всё в одном теге
  • Вопрос задан
  • 317 просмотров
Пригласить эксперта
Ответы на вопрос 1
@olijen Автор вопроса
Сам спросил - сам ответил =) Со stackoverflow
XSLT 1.0. Три варианта.

Дважды используется following-sibling, что некрасиво и непроизводительно.
<xsl:for-each select="//tag[@ROWNUM = following-sibling::tag/@ROWNUM]">
    <name>
        <xsl:value-of select="."/>
        <xsl:variable name="rownum" select="@ROWNUM"/>
        <xsl:value-of select="./following-sibling::tag[@ROWNUM = $rownum]"/>
    </name>
</xsl:for-each>

Используем ключ. И два цикла, что тоже неизящно.
<xsl:key name="num" match="tag" use="@ROWNUM"/>

<xsl:for-each select="//tag[@ROWNUM = following-sibling::tag/@ROWNUM]/@ROWNUM">
    <name>
        <xsl:for-each select="key('num', .)">
            <xsl:value-of select="."/>
        </xsl:for-each>
    </name>
</xsl:for-each>

Опять используем ключ. Вместо второго цикла используем доступ по индексу.
<xsl:key name="num" match="tag" use="@ROWNUM"/>

<xsl:for-each select="//tag[@ROWNUM = following-sibling::tag/@ROWNUM]/@ROWNUM">
    <name>
        <xsl:value-of select="key('num', .)[1]"/>
        <xsl:value-of select="key('num', .)[2]"/>
    </name>
</xsl:for-each>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы