Обернуть группы узлов без атрибута в XSLT - PullRequest
0 голосов
/ 11 мая 2018

Я хочу обернуть группы элементов новым родительским элементом. Такие группы появляются во многих местах в документе. Элементы не имеют атрибута. С помощью for-each-group мне удается включить все нужные элементы документа в большую группу с новым родительским элементом, но я хочу различать группы в зависимости от их появления. Нашел много похожих вопросов и ответов, но не смог решить проблему.

Мой документ

<modul>
    <body>
        <Standard>some text</Standard>
        <Herausforderung>some text</Herausforderung>
        <Standard>some text
           <d2tb>some text</d2tb>
        </Standard>
        <Aufzhlungbullets>some text</Aufzhlungbullets>
        <Aufzhlungbullets>some text</Aufzhlungbullets>
        <Aufzhlungbullets>some text</Aufzhlungbullets>
        <Standard>some text
           <d2ti>some text</d2ti>
        </Standard0>
        <Aufzhlungbullets>some text</Aufzhlungbullets>
        <Aufzhlungbullets>some text</Aufzhlungbullets>
        <Aufzhlungbullets>some text</Aufzhlungbullets>
        <Standard>some text</Standard>
   </body>
</modul>

Желаемый выход

<modul>
        <body>
            <Standard>some text</Standard>
            <Herausforderung>some text</Herausforderung>
            <Standard>some text
               <d2tb>some text</d2tb>
            </Standard>
            <list>
               <Aufzhlungbullets>some text</Aufzhlungbullets>
               <Aufzhlungbullets>some text</Aufzhlungbullets>
               <Aufzhlungbullets>some text</Aufzhlungbullets>
            </list>
            <Standard>some text
               <d2ti>some text</d2ti>
            </Standard0>
            <list>
               <Aufzhlungbullets>some text</Aufzhlungbullets>
               <Aufzhlungbullets>some text</Aufzhlungbullets>
               <Aufzhlungbullets>some text</Aufzhlungbullets>
            </list>
            <Standard>some text</Standard>
       </body>
    </modul>

Моя таблица стилей XSLT

<xsl:template match="body">
        <list>
        <xsl:for-each-group select="Aufzhlungbullets" group-by=".">
                <xsl:copy-of select="current-group()"/>
        </xsl:for-each-group>
        </list>
    </xsl:template>

примечание: я знаю, что этот шаблон подавляет все остальное содержимое. Сначала я сосредоточился на правильной группировке. Содержимое остальной части документа, конечно, должно быть видно, но я не думаю, что это серьезная проблема.

С этим шаблоном я получаю только все элементы в большой группе.

<modul>
    <list>
      <Aufzhlungbullets>some text</Aufzhlungbullets>
      <Aufzhlungbullets>some text</Aufzhlungbullets>
      <Aufzhlungbullets>some text</Aufzhlungbullets>
      <Aufzhlungbullets>some text</Aufzhlungbullets>
      <Aufzhlungbullets>some text</Aufzhlungbullets>
      <Aufzhlungbullets>some text</Aufzhlungbullets>
      <Aufzhlungbullets>some text</Aufzhlungbullets>
   </list>
</modul>

Я перепробовал много вариантов моего шаблона - безуспешно. Как я могу различить, что требуемые элементы появляются в разных группах в документе?

1 Ответ

0 голосов
/ 11 мая 2018

Попробуйте вместо этого использовать group-adjacent на xsl:for-each-group, сгруппировать смежные узлы по их имени и обернуть группу в тег <list>, если это узел Aufzhlungbullets:

<xsl:template match="body">
    <list>
        <xsl:for-each-group select="*" group-adjacent="local-name()">
            <xsl:choose>
                <xsl:when test="self::Aufzhlungbullets">
                    <list>
                        <xsl:copy-of select="current-group()" />    
                    </list>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:copy-of select="current-group()" />
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each-group>
    </list>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...