@SeanB.Durkin のおかげで、よりクリーンな述語を利用するように更新されました。
I. XSLT 1.0 ソリューション
この XSLT の場合:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output omit-xml-declaration="no" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:key name="kChapters" match="page" use="." />
<xsl:template match="/*">
<book>
<xsl:apply-templates
select="page[generate-id() = generate-id(key('kChapters', .)[1])]" />
</book>
</xsl:template>
<xsl:template match="page">
<xsl:copy-of select=".|key('kChapters', .)[last()]" />
</xsl:template>
</xsl:stylesheet>
...元の XML に適用されます。
<book>
<page number="1">Chapter01</page>
<page number="2">Chapter01</page>
<page number="3">Chapter01</page>
<page number="4">Chapter01</page>
<page number="5">Chapter01</page>
<page number="6">Chapter01</page>
<page number="7">Chapter02</page>
<page number="8">Chapter02</page>
<page number="9">Chapter02</page>
<page number="10">Chapter02</page>
<page number="11">Chapter02</page>
<page number="12">Chapter02</page>
<page number="13">Chapter03</page>
<page number="14">Chapter03</page>
<page number="15">Chapter03</page>
<page number="16">Chapter03</page>
<page number="17">Chapter03</page>
<page number="18">Chapter03</page>
</book>
...目的の結果が生成されます。
<?xml version="1.0"?>
<book>
<page number="1">Chapter01</page>
<page number="6">Chapter01</page>
<page number="7">Chapter02</page>
<page number="12">Chapter02</page>
<page number="13">Chapter03</page>
<page number="18">Chapter03</page>
</book>
説明:
- を適切に使用して、値によって
Muenchian Grouping
一意の<page>
要素を決定することに注意してください。
<page>
一意の要素ごと<page>
に、一意の値を含むグループの最初と最後の 2 つの要素がコピーされます。
Ⅱ.XSLT 2.0 ソリューション
XSLT 2.0 では、ソリューションがさらに単純になることに注意してください。
この XSLT の場合:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output omit-xml-declaration="no" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="/*">
<book>
<xsl:for-each-group select="page" group-by=".">
<xsl:copy-of select=".|current-group()[last()]" />
</xsl:for-each-group>
</book>
</xsl:template>
</xsl:stylesheet>
...元の XML に適用すると、同じ望ましい結果が生成されます。
<?xml version="1.0"?>
<book>
<page number="1">Chapter01</page>
<page number="6">Chapter01</page>
<page number="7">Chapter02</page>
<page number="12">Chapter02</page>
<page number="13">Chapter03</page>
<page number="18">Chapter03</page>
</book>
説明:
- 同じ方法論が適用されますが、Muenchian Grouping の代わりに、XSLT 2.0 の
for-each-group
要素とcurrent-group()
命令が使用されます。