2017-01-06 7 views
0

У меня есть довольно большой XML-файл, содержащий список моделей автомобилей, их цену и ежемесячную цену оплаты. На самом деле есть масса других данных, но это важные фрагменты данных, которые меня интересуют.Сортировка сгруппированных элементов с использованием XSLT 1.0

Есть множество дублированных моделей там по разным ценам/ежемесячным платежам. Моя задача, которую я сделал до сих пор с помощью этого форума, состоит в том, чтобы создать отдельный список моделей (без дубликатов), показывая самый дешевый автомобиль в этой модели.

Бит, на котором я застрял, должен ли я отсортировать этот список с самым низким ежемесячным платежом до самого высокого ежемесячного платежа. Усложнение, являющееся самым дешевым транспортным средством, не всегда равно минимальному ежемесячному платежу.

Мой XML выглядит как это:

<?xml version="1.0" encoding="utf-8"?> 
<Dealer> 
    <Vehicle> 
     <Model>KA</Model> 
     <DealerPriceNoFormat>8700.00</DealerPriceNoFormat> 
     <OptionsFinanceMonthlyPayment>300.50</OptionsFinanceMonthlyPayment> 
    </Vehicle> 
    <Vehicle> 
     <Model>KA</Model> 
     <DealerPriceNoFormat>10000.50</DealerPriceNoFormat> 
     <OptionsFinanceMonthlyPayment>270.50</OptionsFinanceMonthlyPayment> 
    </Vehicle> 
    <Vehicle> 
     <Model>Focus</Model> 
     <DealerPriceNoFormat>12000.00</DealerPriceNoFormat> 
     <OptionsFinanceMonthlyPayment>340.00</OptionsFinanceMonthlyPayment> 
    </Vehicle> 
    <Vehicle> 
     <Model>KA</Model> 
     <DealerPriceNoFormat>9910.00</DealerPriceNoFormat> 
     <OptionsFinanceMonthlyPayment>430.75</OptionsFinanceMonthlyPayment> 
    </Vehicle> 
    <Vehicle> 
     <Model>KUGA</Model> 
     <DealerPriceNoFormat>23010.00</DealerPriceNoFormat> 
     <OptionsFinanceMonthlyPayment>550.20</OptionsFinanceMonthlyPayment> 
    </Vehicle> 
    <Vehicle> 
     <Model>Focus</Model> 
     <DealerPriceNoFormat>15900.00</DealerPriceNoFormat> 
     <OptionsFinanceMonthlyPayment>430.00</OptionsFinanceMonthlyPayment> 
    </Vehicle> 
</Dealer> 

Как я уже говорил, есть множество других данных, но это основная структура.

И мой XSLT выглядит следующим образом:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
<xsl:output method="html" omit-xml-declaration="yes" indent="yes" version="4.0" encoding="iso-8859-1" /> 
    <xsl:key name="by-id" match="Dealer/Vehicle" use="Model"/> 
    <xsl:template match="Dealer"> 
    <xsl:copy> 
     <xsl:for-each select="Vehicle[generate-id() = generate-id(key('by-id', Model)[1])]"> 
     <xsl:for-each select="key('by-id', Model)"> 
      <xsl:sort select="DealerPriceNoFormat" data-type="number" order="ascending" /> 
      <xsl:if test="position()=1"> 
      <p> 
       <xsl:value-of select="Model" /><br /> 
       <xsl:value-of select="DealerPriceNoFormat" /><br /> 
       <xsl:value-of select="OptionsFinanceMonthlyPayment" /> 
      </p> 
      </xsl:if> 
     </xsl:for-each> 
     </xsl:for-each> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Как я уже сказал, я почти там, просто не могу понять, как то упорядочить список вывода по OptionsFinanceMonthlyPayment.

Так что в случае вывода выше будут выглядеть примерно так, показывая самый дешевый автомобиль в каждой модели, но отсортированы по ежемесячной оплате в списке вывода:

KA 
8700.00 
300.50 

Focus 
12000.00 
340.00 

KUGA 
23010.00 
550.20 

Спасибо заранее.

+1

Можете ли вы показать результат, ожидаемый в этом случае? Спасибо! –

+0

Я редактировал свое сообщение для демонстрации нужного выхода. Приветствия. –

+0

"*, отсортированный по ежемесячному платежу в выходном списке *" Означает ли это, что он сортируется по ежемесячной оплате самого дешевого автомобиля в каждой группе или что-то еще? –

ответ

2

Я хотел бы сделать это в два прохода - что-то вроде:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:exsl="http://exslt.org/common" 
extension-element-prefixes="exsl"> 

<xsl:key name="vehicle-by-model" match="Vehicle" use="Model"/> 

<xsl:template match="/Dealer"> 
    <!-- first-pass --> 
    <xsl:variable name="groups"> 
     <xsl:for-each select="Vehicle[generate-id() = generate-id(key('vehicle-by-model', Model)[1])]"> 
      <group> 
       <xsl:for-each select="key('vehicle-by-model', Model)"> 
        <xsl:sort select="DealerPriceNoFormat" data-type="number" order="ascending" /> 
        <xsl:if test="position()=1"> 
         <model><xsl:value-of select="Model" /></model> 
         <price><xsl:value-of select="DealerPriceNoFormat" /></price> 
         <pmt><xsl:value-of select="OptionsFinanceMonthlyPayment" /></pmt> 
        </xsl:if> 
       </xsl:for-each> 
      </group> 
     </xsl:for-each> 
    </xsl:variable> 
    <!-- output --> 
    <html> 
     <xsl:for-each select="exsl:node-set($groups)/group"> 
      <xsl:sort select="pmt" data-type="number" order="ascending" /> 
      <p> 
       <xsl:value-of select="model" /><br /> 
       <xsl:value-of select="price" /><br /> 
       <xsl:value-of select="pmt" /> 
      </p> 
     </xsl:for-each> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 

Заметим, что для этого требуется процессор, который поддерживает функцию с node-set() расширения.

+1

Работает как сон. Мне пришлось изменить его на msxsl: node-set, но, кроме этого, фантастический. Спасибо вам за помощь. –

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