Aviso: ainda estou aprendendo XML/XSLT, então peço desculpas se isso for simples.
Estou tentando procurar um elemento no nó A, combiná-lo com um elemento semelhante no nó B e retornar uma entrada do nó B para o nó A.
ou seja, encontre o startDate em EmployeeTimeSheetEntry que corresponde a EmployeeTimeValuationResult/bookingDate e retorne o elemento cust_Overtime_HR_Action correspondente :
Estou tentando usar uma chave para gerar uma pesquisa (com base na resposta a esta pergunta: Imprimir tokens separados por vírgula quando eles forem pesquisados em outro nó ), mas não tenho muita clareza sobre onde colocar a instrução apply-templates para recuperar o nó (e estou me confundindo muito agora, andando em círculos).
Exemplo de XML de origem:
<EmployeeTimeSheet>
<EmployeeTimeSheet>
<employeeTimeSheetEntry>
<EmployeeTimeSheetEntry>
<cust_Overtime_HR_ACTION>TOIL</cust_Overtime_HR_ACTION>
<startDate>2024-11-25T00:00:00.000</startDate>
</EmployeeTimeSheetEntry>
<EmployeeTimeSheetEntry>
<cust_Overtime_HR_ACTION>TOIL</cust_Overtime_HR_ACTION>
<startDate>2024-11-27T00:00:00.000</startDate>
</EmployeeTimeSheetEntry>
<EmployeeTimeSheetEntry>
<cust_Overtime_HR_ACTION>Payout</cust_Overtime_HR_ACTION>
<startDate>2024-11-30T00:00:00.000</startDate>
</EmployeeTimeSheetEntry>
</employeeTimeSheetEntry>
<employeeTimeValuationResult>
<EmployeeTimeValuationResult>
<bookingDate>2024-11-25T00:00:00.000</bookingDate>
</EmployeeTimeValuationResult>
</employeeTimeValuationResult>
</EmployeeTimeSheet>
E é isso que estou tentando (e falhando) fazer no XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- generate lookup table - must be top level, i.e. before template match -->
<xsl:key name="timeSheetEntry" match="EmployeeTimeSheet/EmployeeTimeSheet/employeeTimeSheetEntry/EmployeeTimeSheetEntry" use="startDate"/>
<xsl:template match="/">
<EmployeeTimeSheet>
<!-- retrieve cust_Overtime_HR_ACTION where the bookingDate matches the startDate in above lookup -->
<xsl:template match="/">
<xsl:apply-templates select="key('timeSheetEntry', EmployeeTimeSheet/EmployeeTimeSheet/employeeTimeValuationResult/EmployeeTimeValuationResult/bookingDate)/cust_Overtime_HR_ACTION"/>
</xsl:template>
<xsl:for-each select="EmployeeTimeSheet/EmployeeTimeSheet">
<xsl:for-each select="employeeTimeValuationResult/EmployeeTimeValuationResult">
<xsl:variable name="var_TimeValResult" select="./*"></xsl:variable>
<EmployeeTimeSheet>
<xsl:copy-of select="$var_TimeValResult"/>
<xsl:template match="cust_Overtime_HR_ACTION">
<overtimeHRaction>
<xsl:value-of select="."/>
</overtimeHRaction>
</xsl:template>
</EmployeeTimeSheet>
</xsl:for-each>
</xsl:for-each> <!-- EmployeeTimeSheet/EmployeeTimeSheet -->
</EmployeeTimeSheet>
</xsl:template>
</xsl:folha de estilo>
(desculpas pelo código de nível iniciante)
A saída deve ficar assim, com o elemento cust_Overtime_HR_ACTION para 2024-11-25 adicionado ao nó EmployeeTimeValuationResult :
<EmployeeTimeSheet>
<EmployeeTimeSheet>
<employeeTimeValuationResult>
<EmployeeTimeValuationResult>
<bookingDate>2024-11-25T00:00:00.000</bookingDate>
<cust_Overtime_HR_ACTION>TOIL</cust_Overtime_HR_ACTION>
</EmployeeTimeValuationResult>
</employeeTimeValuationResult>
</EmployeeTimeSheet>
Alguém pode me dizer onde estou errando? Uma ferramenta de teste XSLT diz apenas:
Não foi possível gerar o documento XML usando a entrada XML/XSL fornecida. Erros foram relatados durante a compilação da folha de estilo
Não consigo descobrir a lógica necessária para recuperar o nó correspondente.
Muito obrigado antecipadamente por qualquer orientação que você possa fornecer.
Atenciosamente, AJ
Considere este exemplo simplificado :
XML
XSLT 1.0
Resultado