XSLT - для каждой группы - PullRequest
0 голосов
/ 06 марта 2020

Это действительно базовый c вопрос, но я не понимаю, как работает группа для каждой группы. Я хочу объединить смежные разделы верхнего уровня, у которых нет подраздела, в список. Если есть разделы с подразделами, я хочу относиться к ним по-другому, оставляя верхний уровень без изменений и объединяя подразделы в список. Я не хочу смешивать их.

Источник XML

  <?xml version="1.0" encoding="UTF-8"?>
  <body>
     <sec>
        <title>A1</title>
        <p>Stuff A 1</p>
     </sec>
     <sec>
        <title>A2</title>
        <p>Stuff A 2</p>
     </sec>
     <sec>
        <title>A3</title>
        <p>Stuff A 3</p>
        <sec>
           <title>B1</title>
           <p>Stuff B1</p>
        </sec>
        <sec>
           <title>B2</title>
           <p>Stuff B2</p>
        </sec>
     </sec>
     <sec>
        <title>A4</title>
        <p>Stuff A 4</p>
     </sec>
  </body>

Желаемый результат

  <body>
     <list>
           <list-item><title>A1</title><p>Stuff A 1</p></list-item>
           <list-item><title>A2</title><p>Stuff A 2</p></list-item>
     </list>
     <sec>
        <title>A3</title>
        <p>Stuff A 3</p>
        <list>
          <list-item><title>B1</title><p>Stuff B1</p></list-item>
          <list-item><title>B2</title><p>Stuff B2</p></list-item>
        </list>
     </sec>
     <list>
        <list-item><title>A4</title><p>Stuff A 4</p></list-item>
     </list>
  </body>

XSLT-фрагмент Это определенно не правильно. Кроме того, это не единственный способ, которым я пробовал, просто наименее грязный пост. То, как я думаю для каждой группы должна работать, я продолжаю получать ошибку An empty sequence is not allowed as the @group-adjacent attribute of xsl:for-each-group. Так что это всего лишь фрагмент, чтобы начать кого-то, кто знает, что они делают.

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

        <!-- Identity Template -->
        <xsl:template match="@*|node()" name="default" mode="#all">
            <xsl:copy>
                <xsl:copy-of select="@*"/>
                <xsl:apply-templates mode="#current"/>
            </xsl:copy>
        </xsl:template>

        <!-- Make top level body tag -->
        <xsl:template match="body">
            <body>
                <xsl:for-each-group select="sec[not(sec)]" group-adjacent=".">
                    <list>
                        <xsl:apply-templates select="current-group()"/>
                    </list>
                </xsl:for-each-group>
          </body>
        </xsl:template>

        <xsl:template match="sec[not(sec)]">
            <list-item>
                <xsl:copy-of select="*"/>
            </list-item>
        </xsl:template>

    </xsl:stylesheet>

1 Ответ

1 голос
/ 06 марта 2020

Попробуйте

<xsl:for-each-group select="sec" group-adjacent="exists(child::sec)">

, что даст группу из sec элементов с дочерним элементом sec, затем группу, у которой этого нет, и т. Д.

В пределах for-each-group вам может потребоваться выполнить <xsl:choose><xsl:when test="child::sec">..., чтобы применить различную обработку к двум типам групп.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...