使用XSLT通过嵌套属性对复杂的XML结构进行排序

时间:2012-03-26 14:11:27

标签: xml xslt

我希望使用xsltproc:

使用XSLT对XML结构进行排序

xml需要根据销售人员在Usercontent中的标准销售额从CompanyLocation中进行排序。然而,我的XSLT似乎永远不会对数据进行排序,只能复制它。

下面是一个CompanyLocation XML树结构,我有大约400个其他人。

XML数据:

<Company>
<CompanyStats>
    <CompanyLocation="London">
        <OfficeID>1</OfficeID>
        <Totalworkers>20
        <NoCleaners>2
        <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
            <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>

这是我附加的XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="node()|@*">
        <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
        </xsl:copy> 
    </xsl:template>
<xsl:template match="CompanyStats">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()">
            <xsl:sort select="CompanyLocation/UserContent/StandardSales/Sales" order="descending"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

由于我有大约400个公司位置树,我希望按销售订购每个CompanyLocaiton的整棵树:

<CompanyLocation="London">
<.....>
    <StandardSales>
      <Sales>4</Sales>
    <StandardSales>
<.....>
</CompanyLocation>
<CompanyLocation="Birmingham">
<.....>
    <StandardSales>
     <Sales>25</Sales>
<StandardSales>
    <.....>
</CompanyLocation>
<CompanyLocation="Norwich">
<.....>
    <StandardSales>
     <Sales>35</Sales>
    <StandardSales>
<.....>
</CompanyLocation>

2 个答案:

答案 0 :(得分:2)

那就是对CompanyStats的属性和子元素进行排序,但是该元素没有属性,只有一个元素子元素(和两个空格节点)子元素,所以它所做的只是在元素之前或之后引入空格。我怀疑你想要将排序应用到一个级别:

<xsl:template match="CompanyLocation">
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates select="*">
            <xsl:sort select="UserContent/StandardSales/Sales" order="descending"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

但实际上我并不清楚你想要什么,也许你可以编辑你的问题来添加你想要的结果。

更新即使在评论中澄清后,您也无法轻松提供帮助:

 <CompanyLocation="London">

没有很好的形成,可能是属性名称缺失?

 <Totalworkers>20

格式不正确,缺少结束标记,

并在文件中分类其他错误。我认为正确的输入和工作样式表在下面。

<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>
 </CompanyStats>
</Company>

和样式表,主要的变化是xsl:sort select属性和datatype =“number”来获得数字排序。

<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:template match="node()|@*">
 <xsl:copy>
  <xsl:apply-templates select="@*|node()"/>
 </xsl:copy> 
</xsl:template>

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

答案 1 :(得分:0)

您的排序希望与您选择的节点相关。而不是您所在模板的上下文。

在选择CompanyLocation时尝试<xsl:sort select="UserContent/StandardSales/Sales" order="descending"/>