Sou muito novo em XML/XSLT, então peço desculpas se isso for simples. Estou tentando converter um arquivo XML contendo colunas que indicam pagamentos a funcionários, para que cada pagamento fique em uma linha separada, junto com as informações do funcionário e o tipo de pagamento dessa coluna.
ou seja, a partir disso:
<?xml version='1.0' encoding='UTF-8'?>
<Report>
<Row><col1>ID</col1><col2>NAME</col2><col3>SALARY</col3><col4>BONUS</col4><col5>SICK PAY</col5><col6>CHRISTMAS PAY</col6></Row>
<Row><col1>1001</col1><col2>Joe Bloggs</col2><col3>1500.00</col3><col4>150.00</col4><col5>50.00</col5><col6>0.00</col6></Row>
<Row><col1>1005</col1><col2>Jane Smith</col2><col3>2000.00</col3><col4>250.00</col4><col5>25.00</col5><col6>15.00</col6></Row>
</Report>
para isso:
<?xml version='1.0' encoding='UTF-8'?>
<Report>
<Row><ID>1001</ID><NAME>Joe Bloggs</NAME><PAYTYPE>SALARY</PAYTYPE><AMOUNT>1500.00</AMOUNT></Row>
<Row><ID>1001</ID><NAME>Joe Bloggs</NAME><PAYTYPE>BONUS</PAYTYPE><AMOUNT>150.00</AMOUNT></Row>
<Row><ID>1001</ID><NAME>Joe Bloggs</NAME><PAYTYPE>SICKPAY</PAYTYPE><AMOUNT>50.00</AMOUNT></Row>
<Row><ID>1001</ID><NAME>Joe Bloggs</NAME><PAYTYPE>CHRISTMASPAY</PAYTYPE><AMOUNT>0</AMOUNT></Row>
<Row><ID>1005</ID><NAME>Jane Smith</NAME><PAYTYPE>SALARY</PAYTYPE><AMOUNT>2000.00</AMOUNT></Row>
<Row><ID>1005</ID><NAME>Jane Smith</NAME><PAYTYPE>BONUS</PAYTYPE><AMOUNT>250.00</AMOUNT></Row>
<Row><ID>1005</ID><NAME>Jane Smith</NAME><PAYTYPE>SICKPAY</PAYTYPE><AMOUNT>25.00</AMOUNT></Row>
<Row><ID>1005</ID><NAME>Jane Smith</NAME><PAYTYPE>CHRISTMASPAY</PAYTYPE><AMOUNT>15.00</AMOUNT></Row>
</Report>
O desafio é que ele precisa ser dinâmico para acomodar mais colunas caso sejam adicionadas (com outros pagamentos). Isso é possível?
Sinceramente, não sei por onde começar. Eu tentei juntar alguns XSLT com base em várias pesquisas no Google para tentar gerar pelo menos uma coluna, por exemplo
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="column-name" match="Row[1]/Item" use="count(preceding-sibling::Item)" />
<xsl:template match="/">
<Table>
<xsl:for-each select="Report/Row[position() > 1]">
<Row>
<xsl:apply-templates select="Item"/>
</Row>
</xsl:for-each>
</Table>
</xsl:template>
<xsl:template match="Item">
<Column name="{key('column-name', count(preceding-sibling::Item))}">
<xsl:value-of select="."/>
</Column>
</xsl:template>
</xsl:stylesheet>
Mas nenhuma alegria. Alguém poderia indicar-me a direção correta, por favor?
Muito obrigado :) AJ
O seguinte tenta usar sua chave, mas obviamente não em um elemento inexistente,
Item
mas em qualquer elemento:Resultado:
Eu estou supondo que você quer fazer:
XSLT 1.0
Isso pressupõe que as 2 primeiras colunas sejam sempre
ID
eNAME
que devem ser repetidas para todas as linhas de resultados.