1) SVRL
<sch:schematron ...>
<sch:pattern ..>
<sch:rule context="*[contains(text(), 'abc')]" ...>
<sch:report test="true()" role="info" id="has-ABC">
Element contains 'abc' should be processed specially: '<sch:value-of select="."/>
</sch:report>
</sch:rule>
</sch:pattern>
<sch:schema>
The SVRL result will typically contain an XPath to the context (in the @location attribute) and the assertion text will contain the full path. (The implementation may provide alternate Xpaths to suit your use.)
You can add whatever other info you want to report, either as rich, dynamic text (in the assertion or an sch:diagnostics element) or as generated elements in some other namespace (using sch:properties).
So the SVRL would contain both XPaths to, say, the context, and as much of the text value as desired, plus whatever ancillary annotations you want transferred.
Plus you can state the intent of finding 'abc' so that the maintainer and the recipient are well-informed. (Just being able to say "I found abc" is something, but it will always be part of some pipeline or SDLC, and each stage of the pipeline or SDLC needs to play nicely with the next not assume it is in magnificent isolation.)
2) XML Fragments
There was a W3C specification for fragments, which were (well-formed) partial documents that provided full ancestor context down to the elements of interest. I liked it, and if you are looking for something, it is a good place to start.
XML Fragments never made it into the mainstream though AFAIK: it was especially aimed at query results IORC, which was too much an intrusion into what people hoped might be proprietary opportunities. Also, I don't think it could be workable without the ubiquity of some different validation approach than binary-validity: e.g. some idea of partial validity (which Trang implemented) or Schematron phases.