Список топ-50 XSLT - PullRequest
       1

Список топ-50 XSLT

2 голосов
/ 02 апреля 2012

После моего предыдущего вопроса: Сортировка сложной XML-структуры по вложенному атрибуту с использованием XSLT (Был плохо настроен) извинения.

Мне было любопытно, как вы будете перечислять только топ-10 мест продаж Standard.

Может ли это быть использовано внутри apply-шаблонов, так как у меня возникли трудности с его использованием

<xsl:if test="position() &lt;= 10">

Ответы [ 3 ]

2 голосов
/ 02 апреля 2012

ну, обычно я бы сделал это в два этапа.Но в этом простом случае вы можете использовать переменную в качестве временного шага.измените шаблон, полученный по первому вопросу, следующим образом:

<xsl:template match="CompanyStats">
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <!-- sorting of the CompanyLocation in a temporary variable -->
        <xsl:variable name="CompanyLocationSorted">
            <xsl:apply-templates select="CompanyLocation">
                <xsl:sort data-type="number" select="UserContent/StandardSales/Sales" order="descending"/>
            </xsl:apply-templates>
        </xsl:variable>
        <!-- copies just the first 10 of the sorted CompanyLocation-->
        <xsl:copy-of select="$CompanyLocationSorted/CompanyLocation[position() &lt;= 10]"/>
    </xsl:copy>
</xsl:template>
2 голосов
/ 03 апреля 2012

Вот простое, полное решение, которое является однопроходным :

<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>

Пояснение :

  1. Требуемое количество верхних элементов для обработки указывается в глобальном / внешнем параметре $pTopN.Таким образом, когда этот параметр установлен вне преобразования, преобразование может использоваться для любого требуемого числа без каких-либо изменений.

  2. Ключевой момент находится в xsl:apply-templates,у которого есть xsl:sort ребенок.Это заставляет шаблон (ы) быть примененным к отсортированному списку узлов.

  3. Внутри соответствующего шаблона есть единственное условие, которое сравнивает position() с параметром $pTopN, и обработка выполняется, только если текущая позиция не превысила это число.

2 голосов
/ 02 апреля 2012

Определите это в предикате, например:

<xsl:apply-templates select="item[position() &lt;= 10]" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...