Сортировать сложную структуру XML по вложенному атрибуту, используя XSLT - PullRequest
1 голос
/ 26 марта 2012

Я хочу отсортировать структуру XML с использованием XSLT с использованием xsltproc:

XML-файл должен быть отсортирован из CompanyLocation в соответствии со стандартными продажами продавца внутри Usercontent.Однако мой XSLT, похоже, никогда не сортирует данные, а только копирует их.

Ниже представлена ​​одна древовидная структура XML компании CompanyLocation. У меня есть около 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 Деревьев CompanyLocation, я хочу иметь целое дерево для каждого 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 ]

2 голосов
/ 26 марта 2012

Это сортировка атрибутов и дочерних элементов 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 и тип данных = "число" для получения числовой сортировки.

<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>
0 голосов
/ 26 марта 2012

Ваша сортировка хочет относиться к выбранному вами узлу. не контекст шаблона, в котором вы находитесь.

попробуйте <xsl:sort select="UserContent/StandardSales/Sales" order="descending"/>, так как вы выбираете CompanyLocation.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...