Универсального решения для этого не существует, потому что существует так много разных возможных способов структурирования вашего исходного XML.
Достаточно просто построить XSLT-преобразование, которое будет выводить фрагмент XML-документа. Например, учитывая этот XML:
<header>
<data rec="1"/>
<data rec="2"/>
<data rec="3"/>
<data rec="4"/>
<data rec="5"/>
<data rec="6"/>
</header>
вы можете вывести копию файла, содержащего только data
элементов в определенном диапазоне, с помощью этого XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="startPosition"/>
<xsl:param name="endPosition"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="header">
<xsl:copy>
<xsl:apply-templates select="data"/>
</xsl:copy>
</xsl:template>
<xsl:template match="data">
<xsl:if test="position() >= $startPosition and position() <= $endPosition">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
(Заметьте, кстати, что, поскольку это основано на преобразовании идентичности, оно работает, даже если header
не является элементом верхнего уровня.)
Вам все еще нужно сосчитать элементы data
в исходном XML и повторно выполнить преобразование со значениями $startPosition
и $endPosition
, которые соответствуют ситуации.