Вот простое, полное решение, которое является однопроходным :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pTopN" select="2"/>
<xsl:template match="CompanyStats">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="CompanyLocation">
<xsl:sort data-type="number" select="UserContent/StandardSales/Sales" order="descending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="CompanyLocation">
<xsl:if test="not(position() > $pTopN)">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
, когда это преобразование применяется к следующему документу XML (содержит три CompanyLocation
элементов):
<Company>
<CompanyStats>
<CompanyLocation id="London">
<OfficeID>1</OfficeID>
<Totalworkers>20</Totalworkers>
<NoCleaners>2</NoCleaners>
<TopSales>
<UserID>4</UserID>
<Sales>43</Sales>
<Description> Highest sales this quater</Description>
</TopSales>
<LowestSales>
<UserID>12</UserID>
<Sales>26</Sales>
<Description> Lowest sales this quater</Description>
</LowestSales>
<UserContent>
<ID>4</ID>
<FirstName>Jack</FirstName>
<Surname>Black</Surname>
<StartDate>11/11/2011</StartDate>
<StandardSales>
<SSID>0</SSID>
<Sales>64</Sales>
<SalesManager>Steve Hewitt</SalesManager>
</StandardSales>
<BusinessSales>
<BSID>0</BSID>
<Sales>64</Sales>
<SalesManager>Steve Hewitt</SalesManager>
</BusinessSales>
</UserContent>
</CompanyLocation>
<CompanyLocation id="Paris">
<OfficeID>1</OfficeID>
<Totalworkers>20</Totalworkers>
<NoCleaners>2</NoCleaners>
<TopSales>
<UserID>4</UserID>
<Sales>43</Sales>
<Description> Highest sales this quater</Description>
</TopSales>
<LowestSales>
<UserID>12</UserID>
<Sales>26</Sales>
<Description> Lowest sales this quater</Description>
</LowestSales>
<UserContent>
<ID>4</ID>
<FirstName>Jack</FirstName>
<Surname>Black</Surname>
<StartDate>11/11/2011</StartDate>
<StandardSales>
<SSID>0</SSID>
<Sales>122</Sales>
<SalesManager>Steve Hewitt</SalesManager>
</StandardSales>
<BusinessSales>
<BSID>0</BSID>
<Sales>64</Sales>
<SalesManager>Steve Hewitt</SalesManager>
</BusinessSales>
</UserContent>
</CompanyLocation>
<CompanyLocation id="Berlin">
<OfficeID>1</OfficeID>
<Totalworkers>20</Totalworkers>
<NoCleaners>2</NoCleaners>
<TopSales>
<UserID>4</UserID>
<Sales>43</Sales>
<Description> Highest sales this quater</Description>
</TopSales>
<LowestSales>
<UserID>12</UserID>
<Sales>26</Sales>
<Description> Lowest sales this quater</Description>
</LowestSales>
<UserContent>
<ID>4</ID>
<FirstName>Jack</FirstName>
<Surname>Black</Surname>
<StartDate>11/11/2011</StartDate>
<StandardSales>
<SSID>0</SSID>
<Sales>12</Sales>
<SalesManager>Steve Hewitt</SalesManager>
</StandardSales>
<BusinessSales>
<BSID>0</BSID>
<Sales>64</Sales>
<SalesManager>Steve Hewitt</SalesManager>
</BusinessSales>
</UserContent>
</CompanyLocation>
</CompanyStats>
</Company>
верх (после сортировки) два из них выводятся на выход :
<CompanyStats>
<CompanyLocation id="Paris">
<OfficeID>1</OfficeID>
<Totalworkers>20</Totalworkers>
<NoCleaners>2</NoCleaners>
<TopSales>
<UserID>4</UserID>
<Sales>43</Sales>
<Description> Highest sales this quater</Description>
</TopSales>
<LowestSales>
<UserID>12</UserID>
<Sales>26</Sales>
<Description> Lowest sales this quater</Description>
</LowestSales>
<UserContent>
<ID>4</ID>
<FirstName>Jack</FirstName>
<Surname>Black</Surname>
<StartDate>11/11/2011</StartDate>
<StandardSales>
<SSID>0</SSID>
<Sales>122</Sales>
<SalesManager>Steve Hewitt</SalesManager>
</StandardSales>
<BusinessSales>
<BSID>0</BSID>
<Sales>64</Sales>
<SalesManager>Steve Hewitt</SalesManager>
</BusinessSales>
</UserContent>
</CompanyLocation>
<CompanyLocation id="London">
<OfficeID>1</OfficeID>
<Totalworkers>20</Totalworkers>
<NoCleaners>2</NoCleaners>
<TopSales>
<UserID>4</UserID>
<Sales>43</Sales>
<Description> Highest sales this quater</Description>
</TopSales>
<LowestSales>
<UserID>12</UserID>
<Sales>26</Sales>
<Description> Lowest sales this quater</Description>
</LowestSales>
<UserContent>
<ID>4</ID>
<FirstName>Jack</FirstName>
<Surname>Black</Surname>
<StartDate>11/11/2011</StartDate>
<StandardSales>
<SSID>0</SSID>
<Sales>64</Sales>
<SalesManager>Steve Hewitt</SalesManager>
</StandardSales>
<BusinessSales>
<BSID>0</BSID>
<Sales>64</Sales>
<SalesManager>Steve Hewitt</SalesManager>
</BusinessSales>
</UserContent>
</CompanyLocation>
</CompanyStats>
Пояснение :
Требуемое количество верхних элементов для обработки указывается в глобальном / внешнем параметре $pTopN
.Таким образом, когда этот параметр установлен вне преобразования, преобразование может использоваться для любого требуемого числа без каких-либо изменений.
Ключевой момент находится в xsl:apply-templates
,у которого есть xsl:sort
ребенок.Это заставляет шаблон (ы) быть примененным к отсортированному списку узлов.
Внутри соответствующего шаблона есть единственное условие, которое сравнивает position()
с параметром $pTopN
, и обработка выполняется, только если текущая позиция не превысила это число.