Идея довольно проста:
- определить
rng1
переменную, содержащую элементы, следующие за start
( после оси), - определить
rng2
переменная, содержащая элементы, предшествующие end
( перед осью), - применяет шаблоны к пересечению этих двух наборов элементов.
Но чтобы получить правильно сформированныйПри выводе XML шаблон должен сгенерировать «конверт», например, элемент root
, а затем сгенерировать то, что было сказано внутри него.
Еще одна деталь: поскольку вы не знаете точные XPath для обоих start
и end
код XSLT должен указывать их, начиная с //
.
, поэтому весь сценарий может выглядеть следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<root>
<xsl:variable name="rng1" select="//start/following::*"/>
<xsl:variable name="rng2" select="//end/preceding::*"/>
<xsl:apply-templates select="$rng1 intersect $rng2"/>
</root>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
</xsl:stylesheet>