2014-12-07 4 views
0

У меня возникла проблема с преобразованием XML. Мне нужно преобразовать вывод в файл csv, как в разделе «,».Группировка на основе условий и включение их в одну строку в преобразование XSLT

XML:

<Root> 
<Employees> 
<Employee> 
<Co_Code>DEEP1</Co_Code> 
<ID>12345</ID> 
</Employee> 
<Type Descriptor="Phone"></Type> 
<amount1>8</amount1> 
</Employees> 
<Employees> 
<Employee> 
<Co_Code>DEEP1</Co_Code> 
<ID>12345</ID> 
</Employee> 
<Type Descriptor="Phone"></Type> 
<amount>6</amount> 
</Employees> 
<Employees> 
<Employee> 
<Co_Code>DEEP1</Co_Code> 
<ID>12345</ID> 
</Employee> 
<Type Descriptor="Food"></Type> 
<amount>8</amount> 
</Employees> 
<Employees> 
<Employee> 
<Co_Code>DEEP1</Co_Code> 
<ID>12345</ID> 
</Employee> 
<Type Descriptor="Travel"></Type> 
<amount>8</amount> 
</Employees> 
<Employees> 
<Employee> 
<Co_Code>DEEP1</Co_Code> 
<ID>12345</ID> 
</Employee> 
<Type Descriptor="Other"></Type> 
<amount>800</amount> 
</Employees> 
<Employees> 
<Employee> 
<Co_Code>DEEP1</Co_Code> 
<ID>12346</ID> 
</Employee> 
<Type Descriptor="Phone"></Type> 
<amount>8</amount> 
</Employees> 
<Employees> 
<Employee> 
<Co_Code>DEEP1</Co_Code> 
<ID>12346</ID> 
</Employee> 
<Type Descriptor="Phone"></Type> 
<amount>8</amount> 
</Employees> 
<Employees> 
<Employee> 
<Co_Code>DEEP1</Co_Code> 
<ID>12346</ID> 
</Employee> 
<Type Descriptor="Other"></Type> 
<amount>8</amount> 
</Employees> 
<Employees> 
<Employee> 
<Co_Code>DEEP1</Co_Code> 
<ID>12346</ID> 
</Employee> 
<Type Descriptor="Food"></Type> 
<amount>8</amount> 
</Employees> 
</Root> 

В настоящее время с помощью XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

<xsl:param name="sep" select="', '"/> 

<xsl:output method="text"/> 

<xsl:template match="Root"> 
    <xsl:value-of select="'Co Code', 'ID', 'type', 'amount'" separator="{$sep}"/> 
    <xsl:text>&#10;</xsl:text> 
    <xsl:for-each-group select="Employees" group-adjacent="Type/@Descriptor"> 
    <xsl:if test="position() gt 1"><xsl:text>&#10;</xsl:text></xsl:if> 
    <xsl:value-of select="Employee/Co_Code, Employee/ID, current-grouping-key(), sum(current-group()/amount)" 
     separator="{$sep}"/> 
    </xsl:for-each-group> 
</xsl:template> 

</xsl:stylesheet> 

В настоящее время генерации вывода в ниже формате:

Co Code, ID, type, amount 
DEEP1, 12345, Phone, 6 
DEEP1, 12345, Food, 8 
DEEP1, 12345, Travel, 8 
DEEP1, 12345, Other, 800 
DEEP1, 12346, Phone, 16 
DEEP1, 12346, Other, 8 
DEEP1, 12346, Food, 8 

Но мне нужно организовать несколько строк в столбце. Я пытаюсь получить результат в формате ниже. Сумма сотрудников телефона и продуктов питания должна быть записана в отдельной отдельной колонке, а для другого типа - отдельная строка с колонкой «Телефон и еда» в виде пробела.

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

Благодаря Martin Honnen за помощь.

ответ

1

Вы, наверное, хотите, чтобы начать с группировкой по ID Работника

<xsl:for-each-group select="Employees" 
        group-by="Employee/ID"> 

Вы затем конкретную линию для выдачи «Food» и «Телефон» значения

<xsl:value-of select="Employee/Co_Code, 
         current-grouping-key(), 
         sum(current-group()[Type/@Descriptor = 'Phone']/amount), 
         sum(current-group()[Type/@Descriptor = 'Food']/amount), 
         '', 
         ''" separator="{$sep}"/> 

И внутри текущую группу, вы можете затем группировать записи «Еда» и «Телефон» по их описателю (это было бы необходимо, только если дескрипторы могут быть повторены)

<xsl:for-each-group select="current-group()[not(Type/@Descriptor = ('Phone', 'Food'))]" 
        group-by="Type/@Descriptor"> 

Тогда это прямой случай вывода строки для этого тоже.

Попробуйте XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

<xsl:param name="sep" select="', '"/> 

<xsl:output method="text"/> 

<xsl:template match="Root"> 
    <xsl:value-of select="'Co Code', 'ID', 'type', 'amount'" separator="{$sep}"/> 
    <xsl:text>&#10;</xsl:text> 
    <xsl:for-each-group select="Employees" group-by="Employee/ID"> 
     <xsl:value-of select="Employee/Co_Code, current-grouping-key(), sum(current-group()[Type/@Descriptor = 'Phone']/amount), sum(current-group()[Type/@Descriptor = 'Food']/amount), '', ''" separator="{$sep}"/> 
     <xsl:text>&#10;</xsl:text> 
     <xsl:for-each-group select="current-group()[not(Type/@Descriptor = ('Phone', 'Food'))]" group-by="Type/@Descriptor"> 
      <xsl:value-of select="Employee/Co_Code, '', '', sum(current-group()/amount), current-group()/Type/@Descriptor" separator="{$sep}"/> 
      <xsl:text>&#10;</xsl:text> 
     </xsl:for-each-group> 
    </xsl:for-each-group> 
</xsl:template> 

</xsl:stylesheet>