If you want to achieve this using XPath 2 or 3, for example in a web browser or Node.js with Saxon-JS 2, which supports XPath 3.1:
const lines = SaxonJS.XPath.evaluate(`//div[@class = 'text']/tokenize(., '\n')[normalize-space()]!normalize-space()`, document, { xpathDefaultNamespace : 'http://www.w3.org/1999/xhtml' });
console.log(lines);
console.log(lines[0]);
<script src="https://www.saxonica.com/saxon-js/documentation/SaxonJS/SaxonJS2.rt.js"></script>
<div class='textContainer'>
<div class='textLabel'> </div>
<div class='text'>
"First Line of text"
"Second Line of text"
"Third line of text"
</div>
</div>
It is important to note that in any version of XPath or the DOM, the normalized tree consists of a single text node. However, in XPath 2 or later, you have the ability to split or tokenize the string of a text node into sequences of strings and process each string individually. The Saxon-JS 2 API for JavaScript conveniently returns this XPath 3.1 string sequence as a string array in JavaScript.
In the context of the XPath 2 or 3 data model, the path expression
//div[@class = 'text']/tokenize(., '\n')[normalize-space()]!normalize-space()
provides a sequence of strings that can be accessed by index numbers as typically done in XPath. Therefore,
let $lines := //div[@class = 'text']/tokenize(., '\n')[normalize-space()]!normalize-space() return $lines[2]
will retrieve the second item or string in the sequence of normalized text lines within the text node.