I usually use XML::XSH2 for XML manipulation. In this case, I needed to wrap your input file into <xml>...</xml> and to add _ between subject and names to make it a valid XML. The output is also different to your expected output: spaces between attributes are not optional in XML.
my $input := open 935956.xml ;
my $student_hash := hash concat(@name, '#', @number) $input/xml/data/s
+tudent ;
my $semister_hash := hash ../@number $input/xml/data/semister/@subject
+_names ;
my $out := create xml ;
for my $university in $input/xml/university {
my $new_uni := cp $university into $out/xml ;
for my $student in $new_uni//student {
cp xsh:lookup('student_hash', concat($student/@name, '#', $stu
+dent/@number))/@address into $student ;
for $student/semester cp xsh:lookup('semister_hash', ./@number
+) into . ;
}
}
save :f 935956-out.xml $out ;
|