По какой-то причине вы использовали @wd2:Customer_Invoice_and_Supplier
для выбора атрибута, хотя в вашем входе есть данные элемента, поэтому я думаю, что вы хотите
<xsl:template match="AggregatedData">
<xsl:for-each select="wd2:Report_Data/wd2:Report_Entry/copy-of()">
<xsl:text>{ "Company": "</xsl:text>
<xsl:value-of select="wd2:Company"/>
<xsl:iterate select="wd2:lines">
<xsl:text> { </xsl:text>
<xsl:text> "sequence": "</xsl:text>
<xsl:value-of select="wd2:sequence"/>
<xsl:text>", </xsl:text>
<xsl:text> "sales_item_id": "</xsl:text>
<xsl:value-of select="wd2:sales_item_id"/>
<xsl:text>", </xsl:text>
<xsl:text> "supplier_invoice_no": "</xsl:text>
<xsl:value-of select="accumulator-before('SupplierInvoiceLookup')( normalize-space( wd2:Customer_Invoice_and_Supplier ) )"/>
<xsl:text>", </xsl:text>
</xsl:iterate>
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:template>
И я думаю, что вы хотите, чтобы карта была наоборот с точки зрения ключа и значений, чтобы аккумуляторы могли это сделать
<xsl:accumulator name="CurrentLookupValue" as="xs:string" initial-value="''" streamable="yes">
<xsl:accumulator-rule match="wd1:Customer_Invoice_and_Supplier/text()" select="string()"/>
</xsl:accumulator>
<xsl:accumulator name="SupplierInvoiceLookup" as="map(xs:string,xs:string)" initial-value="map{}" streamable="yes">
<xsl:accumulator-rule match="wd1:Supplier_Invoice_Number/text()" select="map:put($value, accumulator-before('CurrentLookupValue'), string(.))"/>
</xsl:accumulator>
https://xsltfiddle.liberty -development.net / ncdD7mu
Если вы хотите вывести JSON, обратите внимание, что XSLT 3 с XPath 3.1 отображает и обрабатывает массивы, а метод вывода json
позволяет это сделать удобным способом, не пытаясь вывести пары скобок и имен элементов. Но это может быть лучше решено в отдельном вопросе, где вы покажете нам нужный JSON.