この短くて単純な変換(明示的な条件付き命令はまったく使用されません-no xsl:choose
、no xsl:when
、no xsl:otherwise
):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<t>
<xsl:apply-templates select="*">
<xsl:sort select="@rate" data-type="number"/>
</xsl:apply-templates>
</t>
</xsl:template>
<xsl:template match=
"datarate
[not(@rate >= 600)
or
not(../*[@rate = 600]) and not(@rate >= 800)
]"/>
</xsl:stylesheet>
提供されたXMLドキュメントに適用された場合(整形式にするために単一の最上位要素にラップされます):
<t>
<datarate rate="200" />
<datarate rate="600" />
<datarate rate="300" />
<datarate rate="400" />
<datarate rate="800" />
<datarate rate="1000" />
</t>
必要な正しい結果を生成します:
<t>
<datarate rate="600"/>
<datarate rate="800"/>
<datarate rate="1000"/>
</t>
以下に適用すると、わずかに変更されたXMLドキュメント(600のレートではなく、601と650のレート):
<t>
<datarate rate="200" />
<datarate rate="601" />
<datarate rate="650" />
<datarate rate="300" />
<datarate rate="400" />
<datarate rate="800" />
<datarate rate="1000" />
</t>
ここでも正しい結果が生成されます。
<t>
<datarate rate="800"/>
<datarate rate="1000"/>
</t>