@rolfl just to be sure, do you mind validating? I know C#/Linq isn't your cup of tea, but I'm sure it's easier to read than XPath:
XPath = "Model/dsc:Model/dsc:Contour/descendant::dsc:Hole[@id='" + SlabHoleID + "']/dsc:Opening[not(@fixSash)]";
var nodes = _context.Item.Xml.Select(GetDescXPathExpression(XPath, _context.Item.Xml.NameTable));
vs
var nodes = xNode.Descendants(dsc + "Contour")
.Descendants(dsc + "Hole")
.Where(x => x.GetAttributeValue("id") == SlabHoleID)
.Descendants(dsc + "Opening")