Вы можете сделать это, переопределив шаблон идентификации и добавив дополнительные шаблоны, соответствующие критериям для различных элементов списка.
Чтобы соответствовать listAfter , которые вы хотите включить в вывод,Вы должны сделать следующее (например, listAfter элементов без элемента list в качестве родственного элемента)
<xsl:template
match="listAfter[not(preceding-sibling::list|following-sibling::list)]">
Для listBefore вам потребуетсясопоставлять их только в том случае, если у них нет ни списка , ни listAfter элементов в качестве родных элементов
<xsl:template
match="listBefore[not(
preceding-sibling::list|following-sibling::list
|preceding-sibling::listAfter|following-sibling::listAfter)]">
В других случаях вы игнорируете listAfter и listBefore elements:
<xsl:template match="listAfter|listBefore" />
Наконец, вы можете сопоставить элементы item с ни одним из различных элементов списка как дочерние элементы, например:
<xsl:template match="item[not(list|listAfter|listBefore)]">
Итак, с учетом следующего XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="listAfter[not(preceding-sibling::list|following-sibling::list)]">
<list>
<xsl:apply-templates select="@*|node()"/>
</list>
</xsl:template>
<xsl:template match="listBefore[not(preceding-sibling::list|following-sibling::list|preceding-sibling::listAfter|following-sibling::listAfter)]">
<list>
<xsl:apply-templates select="@*|node()"/>
</list>
</xsl:template>
<xsl:template match="listAfter|listBefore" />
<xsl:template match="item[not(list|listAfter|listBefore)]">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<list>No List</list>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Когда это применяется к вашему исходному XML, выводится следующее:
<items>
<item>
<!-- ... various elements ... -->
<list>Enhancements</list>
</item>
<item>
<!-- ... various elements ... -->
<list>Bugs</list>
</item>
<item>
<!-- ... various elements ... -->
<list>Enhancements</list>
</item>
<item>
<!-- ... various elements ... -->
<list>Bugs</list>
</item>
<item>
<!-- ... various elements ... -->
<list>No List</list>
</item>
</items>