2014-01-08 2 views
2

Как я могу добавить значения на основе другого значения?XSLT добавить значение атрибута на основании другого значения

<?xml version="1.0" encoding="UTF-8"?> 
<items> 
    <item id="A1" quantity="5"> 
     <info type="ram x1" import="CA" /> 
    </item> 
    <item id="A2" quantity="3"> 
     <info type="ram x1" import="SA" /> 
    </item> 
    <item id="A3" quantity="10"> 
     <info type="ram x2" import="AU" /> 
    </item> 
</items> 

мне нужно добавить все величины, основанные на type, например мне нужен вывод, как,

барана x1 количество количество = 8 барана x2 = 10

<?xml version="1.0" encoding="UTF-8"?> 
<items> 
     <details type="ram x1" quantity="8"/> 
     <details type="ram x2" quantity="10"/> 
</items> 

пытался для- каждая группа должна сначала получить количество, чтобы узнать, работает ли оно,

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="html" indent="yes" /> 
    <xsl:template match="items"> 
     <xsl:for-each-group select="item" group-by="info/@type"> 
     <xsl:value-of select="sum(@quantity)" /> 
     </xsl:for-each-group> 
    </xsl:template> 
</xsl:stylesheet> 

ответ

3

Использование current-group() функции, т.е .:

<xsl:value-of select="sum(current-group()/@quantity)" /> 
0

@Kirill Polishchuck дал хороший ответ уже, я хотел бы добавить полную таблицу стилей, чтобы проиллюстрировать это.

Он выводит XML, отформатированный так, как вы показали. Помимо использования current-group(), есть также интересное приложение current-grouping-key(), которое извлекает значение, из-за которого группируются текущие элементы.

Вы указали xsl:output method как HTML, но ваш ожидаемый результат выглядит как XML. Поэтому я изменил его для вывода XML.

стилевых

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

<xsl:output method="xml" indent="yes" /> 

<xsl:template match="items"> 
    <xsl:copy> 
    <xsl:for-each-group select="item" group-by="info/@type"> 
     <details> 
      <xsl:attribute name="type"> 
       <xsl:value-of select="current-grouping-key()"/> 
      </xsl:attribute> 
      <xsl:attribute name="quantity"> 
       <xsl:value-of select="sum(current-group()/@quantity)" /> 
      </xsl:attribute> 
     </details> 
    </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

Выход

<?xml version="1.0" encoding="UTF-8"?> 
<items> 
    <details type="ram x1" quantity="8"/> 
    <details type="ram x2" quantity="10"/> 
</items> 

Еще более кратким (но более сложная) версия использует так называемые шаблоны атрибутов значений:

<xsl:for-each-group select="item" group-by="info/@type"> 
    <details type="{current-grouping-key()}" quantity="{sum(current-group()/@quantity)}"/> 
</xsl:for-each-group> 
Смежные вопросы