2016-09-01 3 views
0

У меня есть XML, который выглядит примерно так.Фильтрация, группировка, подсчет и выбор конкретных узлов в XML с использованием XSLT 1.0

<Dealer> 
    <Vehicle> 
    <Model>KA</Model> 
    <Series>Type A</Series> 
    <Price>1000.00</Price> 
    </Vehicle> 
    <Vehicle> 
    <Model>KA</Model> 
    <Series>Type C</Series> 
    <Price>1400.00</Price> 
    </Vehicle> 
    <Vehicle> 
    <Model>KA</Model> 
    <Series>Type A</Series> 
    <Price>1100.00</Price> 
    </Vehicle> 
    <Vehicle> 
    <Model>FOCUS</Model> 
    <Series>Type B</Series> 
    <Price>5000.00</Price> 
    </Vehicle> 
    <Vehicle> 
    <Model>FIESTA</Model> 
    <Series>Type A</Series> 
    <Price>6000.00</Price> 
    </Vehicle> 
</Dealer> 

То, что я пытаюсь сделать, это выбрать 1 конкретную модель (EG: KA), то группа Series в отдельный список (не дубликатов), подсчитать, сколько есть в серии, но показывает только самый дешевый , используя XSLT 1.0.

EG. Мой из пут будет выглядеть примерно так:

KA Type A 2 in stock starting from 1000.00 
KA Type C 1 in stock starting from 1400.00 

Я смотрел на Muenchian метод группировки, но не могу жениться на ней с другими вещами я пытаюсь достичь.

Это моя попытка ниже. Мое мышление состояло в том, чтобы затем отобразить первый элемент в каждой группе, IE. самый дешевый и как-то подсчитывает каждую группу.

<xsl:strip-space elements="*"/> 

<xsl:template match="/Dealer"> 
    <xsl:apply-templates select="Vehicle[Model = 'KA']"/> 
</xsl:template> 

<xsl:key name="fSeries" match="Vehicle" use="Series" /> 
<xsl:template match="Vehicle"> 
    <xsl:for-each select="Vehicle[count(. | key('fSeries', Series)[1]) = 1]"> 
     <xsl:sort select="Price" /> 
     <xsl:for-each select="key('fSeries', Series)"> 
     <xsl:sort select="Price" /> 
     <xsl:value-of select="Model" />&#32;<xsl:value-of select="Series" />&#32;<xsl:value-of select="Price" /><br /> 
     </xsl:for-each> 
    </xsl:for-each> 
</xsl:template> 

Было бы очень здорово в любой помощи. Благодарю.

+1

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

+0

Извините. Да, вы совершенно правы. Я редактировал свое оригинальное сообщение, чтобы включить код. Я немного смущен кодом, потому что может быть совершенно очевидно, что проблема :) –

ответ

1

У вас есть несколько проблем, первая из которых является тот факт, что Vehicle не ребенок Vehicle - поэтому вызов <xsl:for-each select="Vehicle..."> из контекста шаблона, соответствующего Vehicle ничего не даст.

Другое дело, что ваш ключ соответствует всем автомобилям в серии, независимо от модели.

Попробуй так:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" encoding="UTF-8"/> 

<xsl:key name="vehicle-by-series" match="Vehicle[Model='KA']" use="Series" /> 

<xsl:template match="/Dealer"> 
    <xsl:for-each select="Vehicle[Model='KA'][count(. | key('vehicle-by-series', Series)[1]) = 1]"> 
     <xsl:value-of select="Model"/> 
     <xsl:text>: </xsl:text> 
     <xsl:value-of select="Series"/> 
     <xsl:text>, </xsl:text> 
     <xsl:variable name="grp" select="key('vehicle-by-series', Series)" /> 
     <xsl:value-of select="count($grp)"/> 
     <xsl:text> in stock, starting from </xsl:text> 
     <xsl:for-each select="$grp"> 
      <xsl:sort select="Price" data-type="number" order="ascending"/> 
      <xsl:if test="position() = 1"> 
       <xsl:value-of select="Price"/> 
      </xsl:if> 
     </xsl:for-each> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 
+0

Это замечательно. Да, я думаю, проблема заключалась в том, что я пытался выйти замуж за 2 вещи, которые я нашел в Google, и не успел. Огромное спасибо за вашу помощь. –