2012-03-26 5 views
1

Ищу сортировать структуру XML с помощью XSLT с помощью xsltproc:Сортировка сложная структура XML вложенным атрибута с помощью XSLT

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

Ниже приведена одна структура дерева 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 CompanyLocation Деревья Я хочу, чтобы все дерево для каждая компанияLocaiton заказана по продажам:

<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

1. Вы забыли предоставить какой-либо реалистичный XML-документ (нет необходимости сортировать одну компанию), и это способствует путанице. 2. Вам также необходимо указать желаемый результат (соответствующий предоставленному XML-документу). Пожалуйста, отредактируйте вопрос и укажите недостающую информацию. Кроме того, пожалуйста, сделайте XML правильно сформированным. –

ответ

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> 

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

UPDATE даже после разъяснения в комментариях, вы не сделать его легким, чтобы помочь:

<CompanyLocation="London"> 

не очень хорошо образован, предположительно имя атрибута не хватает?

<Totalworkers>20 

не хорошо сформированы, отсутствует закрывающий тег,

и различные другие ошибки в файле. I думаю, что исправлены входные и рабочие таблицы стилей ниже.

<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: сортировки выберите атрибут и тип данных = «число», чтобы получить числовой сортировки.

<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

, конечно, я изменю его сейчас.<...> относится только к недостающим атрибутам выше и ниже – Nerz

+0

, так что теперь я полностью смущен. В вашем примере ввода был только один элемент CompanyLocation (так что вы не можете отсортировать список из 1, но в вашем примере результата есть много, отсортировано по элементу Sales, но, глядя на ваш образец ввода, у каждой компании есть много элементов Sales, которые используются потомком для сортировки? Вам нужно показать результат, который вы хотите _из данного ввода_ –

+0

Привет, Дэвид благодарит вас за терпение. Как я уже говорил выше, мне нужно сортировать данные по стандартным продажам, который является одной из вложенных структур внутри представленного дерева. Дерево - это пример только одного из продуктов CompanyLocations внутри моего xml-кода. Так что я хочу, чтобы все компании были отсортированы по . Надеюсь, это прояснит ситуацию. – Nerz

0

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

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

Смежные вопросы