valu
値が (提供された XML ドキュメントのように) 並べ替えられている場合、これはより高速になります。特に、最後に必要な要素の後にvalue
多くの要素がある場合:
<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="/*">
<xsl:variable name="vStart" select=
"(*[.>=1][1]
|
*[1]
)
[last()]
"/>
<xsl:variable name="vEnd" select=
"($vStart/following-sibling::*[. > 2][1]
/preceding-sibling::*[1]
|
*[last()]
)
[1]
"/>
<xsl:variable name="vPosRange" select=
"count($vEnd/preceding-sibling::*) - count($vStart/preceding-sibling::*)"/>
<xsl:copy-of select=
"$vStart|$vStart/following-sibling::*[not(position() > $vPosRange)]"/>
</xsl:template>
</xsl:stylesheet>
提供された XML ドキュメントに適用した場合:
<t>
<value>1</value>
<value>1.2</value>
<value>1.3</value>
<value>1.4</value>
<value>1.5</value>
<value>2</value>
<value>2.1</value>
<value>2.3</value>
<value>2.4</value>
<value>2.5</value>
</t>
必要な正しい結果が生成されます。
<value>1</value>
<value>1.2</value>
<value>1.3</value>
<value>1.4</value>
<value>1.5</value>
<value>2</value>
注意してください:
実際には、これにより、純粋な XPath 1.0 ソリューション が得られます$vPosRange
。これは、$vStart
と$vEnd
、それらが定義されている XPath 式を置き換えることができるためです。