Alterar valores em XML com base nos mencionados em outro arquivo XML com base em vários critérios de correspondência

Eu tenho um arquivo XML grande e preciso alterar certos valores para aqueles em outro documento XML com base em vários critérios de correspondência.

Meu arquivo XML grande 'file1.xml' está no seguinte formato:

<institution>
<ukprn>1234</ukprn>
<course>
    <courseID>1</courseID>
    <courseaim>X99</courseaim>
</course>
<student>
    <birthdate>30/10/1985</birthdate>
    <instance>
        <OWNINST>1558310|1</OWNINST>
        <FC>1</FC>
        <STULOAD>100</STULOAD>
        <elq>4</elq>
        <MODE>31</MODE>
        <StudentOnModule>
              <MODID>08|29400</MODID>
              <MODOUT>4</MODOUT>
        </StudentOnModule>
        <StudentOnModule>
              <MODID>08|29091</MODID>
              <MODOUT>4</MODOUT>
        </StudentOnModule>
    </instance>
</student>
<student>
    <birthdate>01/02/1999</birthdate>
    <instance>
        <OWNINST>654321|1</OWNINST>
        <FC>2</FC>
        <elq>2</elq>
        <StudentOnModule>
              <MODID>02|37522</MODID>
              <MODOUT>6</MODOUT>
        </StudentOnModule>
        <StudentOnModule>
              <MODID>02|48966</MODID>
              <MODOUT>1</MODOUT>
        </StudentOnModule>
    </instance>
    <instance>
        <OWNINST>654321|2</OWNINST>
        <FC>6</FC>
        <elq>1</elq>
        <StudentOnModule>
              <MODID>08|29400</MODID>
              <MODOUT>4</MODOUT>
        </StudentOnModule>
        <StudentOnModule>
              <MODID>08|29091</MODID>
              <MODOUT>4</MODOUT>
        </StudentOnModule>
    </instance>
</student>
</institution>

Eu tenho um segundo arquivo 'file2.xml' que contém os dados para atualizar 'file1.xml'. Está estruturado assim:

<studentstoamend>
<student><OWNINST>1558310|1</OWNINST><MODID>08|29400</MODID><MODOUT>6</MODOUT></student>
<student><OWNINST>1558310|1</OWNINST><MODID>08|29091</MODID><MODOUT>6</MODOUT></student>
</studentstoamend>

Para cada aluno em 'File2.xml', quero atualizar o MODOUT no File1.xml para se tornar o valor em File2.xml. Por exemplo, em File1.xml: OWNINST = 1558310 | 1, MODID = 08 | 29400 possui MODOUT = 4, mas File2.xml especifica que MODOUT = 6, portanto, File1.xml deve ser atualizado para MODOUT = 6 para essa combinação específica OWNINST / MODOUT . O arquivo de saída deve ser uma cópia exata de file1.xml, mas com as alterações especificadas em File2.xml.

Por favor, você poderia ajudar com isso, pois eu não pareço capaz de fazê-lo funcionar.

Foi assim que cheguei:

<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="no"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>        
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Student/Instance[OWNINST = document('file2.xml')/studentstoamend/STUDENT/OWNINST/MODID]/MODOUT">
        <xsl:copy-of select="document('file2.xml')/studentstoamend/STUDENT[OWNINST = current()/../OWNINST]/MODID[MODID = current()/MODID]/MODOUT"/>
    </xsl:template>

</xsl:stylesheet>

Portanto, o arquivo de saída deve ser:

<institution>
<ukprn>1234</ukprn>
<course>
    <courseID>1</courseID>
    <courseaim>X99</courseaim>
</course>
<student>
    <birthdate>30/10/1985</birthdate>
    <instance>
        <OWNINST>1558310|1</OWNINST>
        <FC>1</FC>
        <STULOAD>100</STULOAD>
        <elq>4</elq>
        <MODE>31</MODE>
        <StudentOnModule>
              <MODID>08|29400</MODID>
              <MODOUT>6</MODOUT>
        </StudentOnModule>
        <StudentOnModule>
              <MODID>08|29091</MODID>
              <MODOUT>6</MODOUT>
        </StudentOnModule>
    </instance>
</student>
<student>
    <birthdate>01/02/1999</birthdate>
    <instance>
        <OWNINST>654321|1</OWNINST>
        <FC>2</FC>
        <elq>2</elq>
        <StudentOnModule>
              <MODID>02|37522</MODID>
              <MODOUT>6</MODOUT>
        </StudentOnModule>
        <StudentOnModule>
              <MODID>02|48966</MODID>
              <MODOUT>1</MODOUT>
        </StudentOnModule>
    </instance>
    <instance>
        <OWNINST>654321|2</OWNINST>
        <FC>6</FC>
        <elq>1</elq>
        <StudentOnModule>
              <MODID>08|29400</MODID>
              <MODOUT>4</MODOUT>
        </StudentOnModule>
        <StudentOnModule>
              <MODID>08|29091</MODID>
              <MODOUT>4</MODOUT>
        </StudentOnModule>
    </instance>
</student>
</institution>

Muito obrigado por olhar para isso. Martin

questionAnswers(1)

yourAnswerToTheQuestion