Вот фрагмент XSLT, который делает то, что вы описываете.
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="iso-8859-1" indent="yes" omit-xml-declaration="no"/>
<xsl:template match="file">
<xsl:copy>
<xsl:apply-templates select="row[(position()>=3 and position()<=5) or (position()>=7 and position()<=8)]" />
</xsl:copy>
</xsl:template>
<xsl:template match="row">
<xsl:copy>
<xsl:apply-templates select="cell[position()=1 or position()=3]" />
</xsl:copy>
</xsl:template>
<xsl:template match="cell">
<xsl:copy-of select="." />
</xsl:template>
</xsl:stylesheet>
Чтобы выбрать строки, которые вы хотите использовать в выводе, я думаю, что для начала я бы пометил их атрибутом, который будет использоваться в качестве фильтра.
В коде, вызывающем XSLT, вы можете сделать это с помощью методов DOM сразу после загрузки XML-документа и перед применением преобразования. Например, чтобы оставить Джима Смита, но отбросить Роя Роджерса:
<row keep="-1">
<cell>Jim</cell>
<cell>Smith</cell>
<cell>34</cell>
</row>
<row>
<cell>Roy</cell>
<cell>Rogers</cell>
<cell>22</cell>
</row>
И измените строку в XSLT на:
<xsl:apply-templates select="row[@keep=-1]" />