vacios son que los etiquetas etiqueta elementos ejemplos ejemplo con cerrar basicas atributos atributo xml xslt xslt-1.0

son - Cambie los valores en XML basados ​​en los referenciados en otro archivo XML basado en múltiples criterios de coincidencia



etiquetas xml (1)

Tengo un gran archivo XML y necesito cambiar ciertos valores a los de otro documento XML basado en múltiples criterios de coincidencia.

Mi archivo XML grande ''archivo1.xml'' está en el siguiente 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>

Tengo un segundo archivo ''file2.xml'' que contiene los datos para actualizar ''file1.xml'' con. Está estructurado así:

<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 alumno en ''File2.xml'', deseo actualizar el MODOUT en File1.xml para convertirme en el valor en File2.xml. Por ejemplo, en File1.xml: OWNINST = 1558310 | 1, MODID = 08 | 29400 tiene MODOUT = 4 pero File2.xml especifica que MODOUT = 6, por lo que File1.xml debe actualizarse a MODOUT = 6 para esa combinación particular OWNINST / MODOUT . El archivo de salida debe ser una copia exacta de file1.xml pero con los cambios especificados en File2.xml.

Por favor, podría ayudarme con esto, ya que parece que no puedo hacer que funcione.

Esto es lo lejos que llegué:

<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>

Entonces el archivo de salida debería 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>

Muchas gracias por mirar esto. Martín


Lo principal a tener en cuenta es que XML (y XSLT) distingue entre mayúsculas y minúsculas, por lo que una plantilla que contenga Student en la ruta no coincidirá con un elemento de student en su XML.

Otro problema es que ha perdido elementos de la ruta, por ejemplo, StudentOnModule es el padre de MODOUT , no instancia.

Prueba esta plantilla ...

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

Tenga en cuenta que podría tener la tentación de simplificar la plantilla, para evitar tener que hacer referencia al segundo archivo dos veces ...

<xsl:template match="MODOUT"> <xsl:variable name="modout" select="document(''file2.xml'')/studentstoamend/student[OWNINST = current()/../../OWNINST][MODID = current()/../MODID]/MODOUT" /> <xsl:choose> <xsl:when test="$modout"> <xsl:copy-of select="$modout" /> </xsl:when> <xsl:otherwise> <xsl:copy-of select="." /> </xsl:otherwise> </xsl:choose> </xsl:template>