Logical intent
Below is a breakdown of the CSS selectors originally posted in the question. This is an attempt to summarize how both CSS rules can be expressed using valid CSS (a discussion started by @thgaskell and @BoltClock). I'll leave the question of specificity to the other posters.
First rule
input:not([type="text"],[type="password"],.someClass) {}
This is a non-validating selector in CSS3, which might not be supported by any known browsers at present.
The logical intent of the selector is !(a or b or c), which is equivalent to !a and !b and !c. For CSS selectors a logical and operation requires chaining, which can be expressed as :not(a):not(b):not(c).
Thus the first rule can be expressed in valid CSS as follows:
input:not([type="text"]):not([type="password"]):not(.someClass) {}
Second rule
input:not(#someId[type="text"]) {}
This is a non-validating selector in CSS3, which might not be supported by any known browsers at present.
The logical intent of the selector is !(a and b), which is equivalent to !a or !b. For CSS selectors a logical or operation requires using multiple selectors (one selector for each operand), which can be expressed as :not(a), :not(b).
Thus the second rule can be expressed in valid CSS as follows:
input:not(#someId), input:not([type="text"]) {}
Summary
A logical and operation requires chaining each operand.
.a.b {} /* Matches elements with both classes */ /* (a and b) */ :not(.a):not(.b) {} /* Matches elements with neither class */ /* (!a and !b) == !(a or b) */
A logical or operation requires using multiple selectors (one selector for each operand).
.a, .b {} /* Matches elements with either class */ /* (a or b) */ :not(.a), :not(.b) {} /* Matches elements that don't have both classes */ /* (elements with none or only one of the classes) */ /* (aka: not both, nand, alternative denial */ /* (!a or !b) == !(a and b) */
notis part of CSS3 specs, and many browsers support multiple selectors as argument for it, if that what you are referring to as not valid.:not(X)can only take in simple selectors. You'd have to expand it out to be like:input:not([type="text"]), input:not([type="password"]), input:not(.someClass) {...}andinput:not(#someId):not([type="text"]) {...}.input:not([type="text"]):not([type="password"]):not(.someClass)which is better and work as well. Does this mean it should be calculated as 0031, then? How about those that support multiple ones, how do they calculate?