You may also try to go back to relational data and than back to xml; something like:
DECLARE @res xml =
<result>
<StudentID>1</StudentID>
<Subject>English</Subject>
<Marks>67</Marks>
</result>
<result>
<StudentID>1</StudentID>
<Subject>Science</Subject>
<Marks>75</Marks>
</result>
DECLARE @student xml =
<Student>
<StudentID>1</StudentID>
<Name>XYZ</Name>
<Roll>15</Roll>
<Attendance>50</Attendance>
</Student>
;
WITH cte_1
AS ( SELECT t.c.value( StudentID[1] , int ) AS [StudentID]
,t.c.value( Subject[1] , varchar(50) ) AS [Subject]
,t.c.value( Marks[1] , int ) AS [Marks]
FROM @res.nodes( /result ) AS t ( c )
),
cte_2
AS ( SELECT t.c.value( StudentID[1] , int ) AS [StudentID]
,t.c.value( Name[1] , varchar(50) ) AS [Name]
,t.c.value( Roll[1] , int ) AS [Roll]
,t.c.value( Attendance[1] , int ) AS [Attendance]
FROM @student.nodes( /Student ) AS t ( c )
)
SELECT student.StudentID
,student.[Name]
,student.Roll
,student.Attendance
,( SELECT result.[Subject]
,result.Marks
FROM cte_1 AS result
WHERE student.StudentID = result.StudentID
FOR
XML AUTO
,TYPE
,ELEMENTS
)
FROM cte_2 AS student
FOR XML AUTO
,ELEMENTS
Returns:
<student>
<StudentID>1</StudentID>
<Name>XYZ</Name>
<Roll>15</Roll>
<Attendance>50</Attendance>
<result>
<Subject>English</Subject>
<Marks>67</Marks>
</result>
<result>
<Subject>Science</Subject>
<Marks>75</Marks>
</result>
</student>
Not exactly your example, but close.