Это короткое и простое преобразование (без явной команды условной используется на всех - не xsl:choose
, нет xsl:when
, нет 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>
Можете ли вы привести конкретный пример того, как вы хотите, чтобы строка выглядела? Кроме того, используете ли вы XSLT/XPath 1.0 или 2.0? – Dabbler