Это действительно базовый 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>