This doesn't create multirow or multicolumn headers based on the names of the dimensions, but it at least does get them displayed.
print(xtable(format(ftable(tb))),
include.rownames=FALSE, include.colnames=FALSE,
sanitize.text.function = function(x) {gsub('"',"",x)})
which gives
% latex table generated in R 2.15.1 by xtable 1.7-0 package
% Tue Oct 09 11:28:33 2012
egin{table}[ht]
egin{center}
egin{tabular}{llllll}
hline
hline
& Ys & 1 & 2 & 3 & 4 \
Xs & & & & & \
1 & & 0 & 0 & 0 & 1 \
2 & & 0 & 1 & 0 & 0 \
3 & & 1 & 0 & 0 & 0 \
4 & & 0 & 0 & 1 & 0 \
hline
end{tabular}
end{center}
end{table}
You can restore the horizontal lines in the "right" place as well:
print(xtable(format(ftable(tb))),
include.rownames=FALSE, include.colnames=FALSE,
sanitize.text.function = function(x) {gsub('"',"",x)},
hline.after = c(-1, 2, nrow(tb)+2))
giving
% latex table generated in R 2.15.1 by xtable 1.7-0 package
% Tue Oct 09 11:29:21 2012
egin{table}[ht]
egin{center}
egin{tabular}{llllll}
hline
& Ys & 1 & 2 & 3 & 4 \
Xs & & & & & \
hline
1 & & 0 & 0 & 0 & 1 \
2 & & 0 & 1 & 0 & 0 \
3 & & 1 & 0 & 0 & 0 \
4 & & 0 & 0 & 1 & 0 \
hline
end{tabular}
end{center}
end{table}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…