focheck, available on GitHub and bundled with Oxygen, provides the best available way to check, create, and edit XSL-FO markup.
A distinctive feature of XSL-FO is that most of the properties’ values can be expressions that the XSL formatter evaluates when it formats the document. This, of course, stymies grammar-based checking of an XSL-FO document because the datatype of a property value can’t be known until the expression is evaluated.
focheck combines a RELAX NG schema for checking the structure of an XSL-FO file with Schematron and a REx-generated parser for evaluating property value expressions. The Schematron also checks relationships between elements that can’t be expressed in a grammar. When used as an Oxygen framework, the included Schematron Quick-Fixes allow interactive fixing of some of the errors common in XSL-FO documents.