这个简短而简单的转换(根本没有使用明确的条件指令—— 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>