Поскольку вы используете XSLT 2.0, вы можете объявить порядок сортировки и разделить значения
<xsl:param name="sortOrder" select="'Fail,Review,Pass'" />
<xsl:variable name="valSequence" select="tokenize($sortOrder, ',')"/>
Выполнить сортировку на ResultStatus
, используя заявленный порядок для элемента Screening
, имеющего @type
значения как FEMP
и PEMP
и получить 1-й элемент в выходных данных
<xsl:for-each select="Screening[@type = 'FEMP' or @type = 'PEMP']">
<xsl:sort select="index-of($valSequence, ScreeningStatus/ResultStatus)" />
<!-- Get 1st element after sorting -->
<xsl:if test="position() = 1">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:if>
</xsl:for-each>
Для остальных узлов примените их как
<xsl:apply-templates select="Screening[not(@type = 'FEMP' or @type = 'PEMP')]" />
Полный XSLT такой, как показано ниже
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:param name="sortOrder" select="'Fail,Review,Pass'" />
<xsl:variable name="valSequence" select="tokenize($sortOrder, ',')"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="Screenings">
<xsl:copy>
<xsl:for-each select="Screening[@type = 'FEMP' or @type = 'PEMP']">
<xsl:sort select="index-of($valSequence, ScreeningStatus/ResultStatus)" />
<!-- Get 1st element after sorting -->
<xsl:if test="position() = 1">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:if>
</xsl:for-each>
<xsl:apply-templates select="Screening[not(@type = 'FEMP' or @type = 'PEMP')]" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Выход
<BackgroundReports>
<BackgroundReportPackage>
<Screenings>
<Screening type="FEMP">
<ScreeningStatus>
<OrderStatus>Completed</OrderStatus>
<ResultStatus>Fail</ResultStatus>
</ScreeningStatus>
</Screening>
<Screening type="TEST">
<ScreeningStatus>
<OrderStatus>Completed</OrderStatus>
<ResultStatus>Review</ResultStatus>
</ScreeningStatus>
</Screening>
</Screenings>
</BackgroundReportPackage>
</BackgroundReports>