Я хочу обернуть группы элементов новым родительским элементом. Такие группы появляются во многих местах документа. У элементов нет атрибута.
С 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>
Я пробовал множество вариантов своего шаблона - безуспешно. Как отличить нужные элементы в разных группах документа?





Попробуйте вместо этого использовать 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>
Очень хорошо, спасибо. Оно работает. В своих попытках я не использовал local-name () для соседней группы.