我希望使用xsltproc:
使用XSLT对XML结构进行排序xml需要根据销售人员在Usercontent中的标准销售额从CompanyLocation中进行排序。然而,我的XSLT似乎永远不会对数据进行排序,只能复制它。
下面是一个CompanyLocation XML树结构,我有大约400个其他人。
<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>
答案 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"/>
。