Hola:
Lo primero ten mucho cuidado al construir tu documento (x)HTML, veo errores muy gordos ahí. Si empezamos de esa base, todo funcionará mal.
Ésta sería mi solucion. Un poquito de DOM para navegar por los nodos, y fácil fácil:
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<meta name="Author" content="derkeNuke" />
<title>Página nueva</title>
<style type="text/css">
</style>
</head>
<body>
<form onsubmit="return valida(this)" action="">
<input type='checkbox' name='rubros[1]' value='x' />Alimentos
<ul id="uno">
<li><input type='checkbox' name='subrubros[1][2]' value='a' />Frutas</li>
<li><input type='checkbox' name='subrubros[1][3]' value='b' />Verduras</li>
</ul>
<input type='checkbox' name='rubros[1]' value='x' />Prendas de vestir
<ul id="dos">
<li><input type='checkbox' name='subrubros[1][2]' value='a' />Vestidos</li>
<li><input type='checkbox' name='subrubros[1][3]' value='b' />Camisas</li>
</ul>
<button type="submit">Envia</button>
</form>
<script type="text/javascript">
<!--
function valida(fr) {
// Buscamos todos los elementos que se llamen subrubros[1]
var rubros1 = fr["rubros[1]"];
// Miramos que uno y sólo uno esté seleccionado
var seleccionados = [];
for(var i=0; i<rubros1.length; i++) {
if( rubros1[i].checked ) // Si está seleccionado
seleccionados.push( rubros1[i] );
}
// Comprobamos que haya al menos un elemento seleccionado
if( seleccionados.length == 0 ) {
alert("Debe seleccionar al menos un rubro.");
return false;
}
// Ahora con los elementos validamos que haya seleccionado al menos un subrubro de ellos:
for(var i=0; i<seleccionados.length; i++) {
// Vamos mirando su hermano y el hermano del hermano hasta encontrar un UL
var hermanoUL = seleccionados[i].nextSibling;
if( hermanoUL.nodeType!=1 || hermanoUL.tagName.toUpperCase()!="UL" )
hermanoUL = hermanoUL.nextSibling;
//Ahora hermanoUL será la lista (que damos por entendido que contiene los subrubros)
var LIsubrubros = hermanoUL.getElementsByTagName("LI");
var srSeleccionados = 0;
for(var j=0; j<LIsubrubros.length; j++) {
if( LIsubrubros[j].firstChild.checked ) //firstChild será el checkbox si no dejamos espacios en el xHTML
srSeleccionados++;
}
if( srSeleccionados == 0 ) {
alert("Debe seleccionar algún subrubro para '"+seleccionados[i].nextSibling.nodeValue+"'");
return false
}
}
// Si hemos llegado hasta aquí se supone que no han habido errores
return true;
}
// -->
</script>
</body>
</html>
Un saludo