xml - XSLT 列表前 50

标签 xml xslt xpath

继我之前的问题:Sort complex XML structure by nested attribute using XSLT (设置不当)抱歉。

我很好奇您如何只列出标准销售的前 10 个地点。

我在使用它时遇到困难,可以在应用模板中使用它吗

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

最佳答案

这是一个简单、完整的解决方案,它是一次通过:

<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 参数的条件,并且仅当当前位置时才执行处理没有超过这个数字。

关于xml - XSLT 列表前 50,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9977691/

相关文章:

xml - 在同一级别为同一 XML 元素呈现不同的模板

java - Android 空指针异常

xml - 我应该如何将 xml 转换为 csv

java - 在使用 Selenium 进行测试自动化期间检查元素时,某些网页中的元素 "id"会发生变化(不是静态的)。如何处理这种情况?

css - 以下 html 片段需要 xpath 或 css

xml - 使用 OmniXML 添加子节点

java - JAXB 和 XSLT 性能

.net - Wix 安装程序和 XSLT - 省略特定目录中的某些文件

xml - 变量 - 尚未声明(或其声明不在范围内)

xml - Xpath:根据条件选择节点(使用 local-name())