I meant to address that question. I don't think that that's possible. The named patterns are "scoped" within the pure function and are not the patterns that the Cases is making use of.
Also, I meant to comment that, in your replacements rules for the Cases and the StringCases you probably want to use a delayed rule rather than an immediate rule.
Also (again) my final expression above should probably read
StringCases[newData,
"X" ~~ f : NumberString ~~ Whitespace ~~ g : NumberString ~~
Whitespace ~~ h : NumberString ~~ "X" :> ToExpression[{f, g, h}]]
so that you actually get numbers in the lists rather than strings with number characters.
Finally here is an approach using Cases and then modifying the result using StringCases
Cases[x_?(StringMatchQ[#,
NumberString ~~ Whitespace ~~ NumberString ~~ Whitespace ~~
NumberString] &) :>
StringCases[x,
f : NumberString ~~ Whitespace ~~ g : NumberString ~~ Whitespace ~~
h : NumberString :> Sequence @@ ToExpression@{f, g, h}]][data]
or a slightly different approach:
Cases[x_?(StringMatchQ[#,
NumberString ~~ Whitespace ~~ NumberString ~~ Whitespace ~~
NumberString] &) :>
StringReplace[x,
f : NumberString ~~ Whitespace ~~ g : NumberString ~~ Whitespace ~~
h : NumberString :>
ToExpression["{" <> f <> "," <> g <> "," <> h <> "}"]]][data]