Вы можете использовать ключи для поиска компании и регистрации информации
<xsl:key name="book" match="Report_Entry" use="GL_Code" />
<xsl:key name="company" match="Report_Entry" use="COMPANY/Code" />
Но тогда это становится немного грязным, так как вам нужно проверить случай, когда у вас есть книга, но нет компании, или компания, но нет книги, или и то, и другое.
Попробуйте это XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:key name="book" match="Report_Entry" use="GL_Code" />
<xsl:key name="company" match="Report_Entry" use="COMPANY/Code" />
<xsl:template match="RaaSData">
<xsl:text>Company;Code;Cost Center;Book Code </xsl:text>
<xsl:for-each select="Report_Data[1]/Report_Entry">
<xsl:variable name="bu" select="PT-BU_Code" />
<xsl:variable name="prefix" select="concat(PT-BU, ';', $bu, ';')" />
<xsl:for-each select="key('company', $bu)">
<xsl:variable name="company" select="Cost_Center" />
<xsl:for-each select="key('book', $bu)">
<xsl:value-of select="concat($prefix, $company, ';', Book_Code, ' ')" />
</xsl:for-each>
<xsl:if test="not(key('book', $bu))">
<xsl:value-of select="concat($prefix, $company, ';', ' ')" />
</xsl:if>
</xsl:for-each>
<xsl:if test="not(key('company', $bu))">
<xsl:for-each select="key('book', $bu)">
<xsl:value-of select="concat($prefix, ';', Book_Code, ' ')" />
</xsl:for-each>
<xsl:if test="not(key('book', $bu))">
<xsl:value-of select="concat($prefix, ';', ' ')" />
</xsl:if>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>