First you need to ensure that line numbers are maintained when Saxon builds document trees using the doc() function. You can do this by calling setRetainLineNumbers() on the SaxonXQDataSource object.
In your result, your query is returning alternate nodes and atomic values. To get the line number of a node, you have to escape from XQJ into Saxon interfaces: call getSaxonItem() on the XdmItem(), and if it is a node, the result will be an instance of, which has a getLineNumber() method.
Generally, unless you want the portability benefits that come from using XQJ (that is, you want to write applications that work with multiple XQuery engines), I would recommend writing Saxon applications using the s9api interface. It provides access to more of Saxon's capabilities, and is a better fit to Saxon's architecture. However, I've tried to provide "escape hatches" so that you can escape from XQJ interfaces into lower level Saxon interfaces when necessary.


Michael Kay

From: Sweta Kedia []
Sent: 20 October 2009 05:01
Subject: [saxon] How can i get line numbers for each result returned inXQuery.


I am trying to use net.saxon.xqj package for Xquery. I am using the result Sequence to get Item as Stream  and then get its location. But I am getting -1 everytime. Please help, should i use s9Api    or i can get line number through Xqj also.

    public void runQuery() {

        try {
            SaxonXQConnection con = (SaxonXQConnection) xqueryConnection.getConnection();
            con.getStaticContext().declareNamespace("xbrli", "");
            con.getStaticContext().declareNamespace("bvf", "");
            con.getStaticContext().declareNamespace("xsi", "");
            con.getStaticContext().declareNamespace("xlink", "");

            String queryFile="for $s in fn:doc(\"C:/Users/A/Documents/Sweta/users/sweta231119791251796126671/Other/2008/Quarterly/2nd Quarterly/bvf-20081231/bvf-20081231.xml\")" +
            "//bvf:StockholdersEquityBeforeComprehensiveIncomeNetOfTax, "+
             " $c in fn:doc(\"C:/Users/A/Documents/Sweta/users/sweta231119791251796126671/Other/2008/Quarterly/2nd Quarterly/bvf-20081231/bvf-20081231.xsd\")" +    
             "//element[@name=local-name($s)]  "+
            " return($s, data($c/@name))";
            SaxonXQPreparedExpression expr = (SaxonXQPreparedExpression) con.prepareExpression(queryFile);
            SaxonXQForwardSequence rs = (SaxonXQForwardSequence) expr.executeQuery();

            while ( {
                SaxonXQItem item = (SaxonXQItem) rs.getItem();
                Location local = item.getItemAsStream().getLocation();
                System.out.println(item.getItemAsString(null).toString() + " at Line: " + local.getLineNumber());

            / rs.close();
        catch (javax.xml.xquery.XQException xq) {
        catch (Exception ex) {