code: protected void PathExpr() throws javax.xml.transform.TransformerException
    {
  
      int opPos = m_ops.getOp(OpMap.MAPINDEX_LENGTH);
  
      int filterExprMatch = FilterExpr();
  
      if (filterExprMatch != FILTER_MATCH_FAILED)
      {
        // If FilterExpr had Predicates, a OP_LOCATIONPATH opcode would already
        // have been inserted.
        boolean locationPathStarted = (filterExprMatch==FILTER_MATCH_PREDICATES);
  
        if (tokenIs('/'))
        {
          nextToken();
  
          if (!locationPathStarted)
          {
            // int locationPathOpPos = opPos;
            insertOp(opPos, 2, OpCodes.OP_LOCATIONPATH);
  
            locationPathStarted = true;
          }
  
          if (!RelativeLocationPath())
          {
            // "Relative location path expected following '/' or '//'"
            error(XPATHErrorResources.ER_EXPECTED_REL_LOC_PATH, null);
          }
  
        }
  
        // Terminate for safety.
        if (locationPathStarted)
        {
          m_ops.setOp(m_ops.getOp(OpMap.MAPINDEX_LENGTH), OpCodes.ENDOP);
          m_ops.setOp(OpMap.MAPINDEX_LENGTH, m_ops.getOp(OpMap.MAPINDEX_LENGTH) + 1);
          m_ops.setOp(opPos + OpMap.MAPINDEX_LENGTH,
            m_ops.getOp(OpMap.MAPINDEX_LENGTH) - opPos);
        }
      }
      else
      {
        LocationPath();
      }
    }
docs: PathExpr  ::=  LocationPath
  | FilterExpr
  | FilterExpr '/' RelativeLocationPath
  | FilterExpr '//' RelativeLocationPath
  
  @throws XSLProcessorException thrown if the active ProblemListener and XPathContext decide
  the error condition is severe enough to halt processing.
  
  @throws javax.xml.transform.TransformerException